当前位置: 首页 > 知识库问答 >
问题:

当Row包含复杂类型时,如何从RDD[Row]创建Spark DataFrame

景鸿才
2023-03-14

我有一个RDD[HbaseRecord],它包含一个自定义复杂类型Name。这两个类定义如下:

class HbaseRecord(
      val uuid: String,
      val timestamp: String,
      val name: Name
)

class Name(    
    val firstName:                String,     
    val middleName:               String,       
    val lastName:                 String
)

在我代码中的某个点,我想从RDD生成一个DataFrame,这样我就可以将它保存为一个avro文件。我尝试了以下操作:

//I get an Object from Hbase here
val objectRDD : RDD[HbaseRecord] = ... 

//I convert the RDD[HbaseRecord] into RDD[Row]
val rowRDD : RDD[Row] = objectRDD .map(
    hbaseRecord => {
      val uuid : String = hbaseRecord.uuid
      val timestamp : String = hbaseRecord.timestamp
      val name : Name = hbaseRecord.name

      Row(uuid, timestamp, name)
    })

//Here I define the schema
   val schema = new StructType()
                  .add("uuid",StringType)
                  .add("timestamp", StringType)
                  .add("name", new StructType()
                                  .add("firstName",StringType)
                                  .add("middleName",StringType)
                                  .add("lastName",StringType)

//Now I try to create a Dataframe using the RDD[Row] and the schema
val dataFrame = sqlContext.createDataFrame(rowRDD , schema)

我尝试从行中删除复杂类型,因此它将是Row[String,String],然后就没有错误了。所以我假设问题出在复杂类型上。

我做错了什么?或者我可以遵循什么其他方法来生成具有复杂类型的DataFrame?

共有1个答案

胡厉刚
2023-03-14

我只是使用了简单的case class来代替class。name列不符合定义的架构。将name列转换为行类型,它应该可以工作。

val rowRDD : RDD[Row] = objectRDD .map(
    hbaseRecord => {
      val uuid : String = hbaseRecord.uuid
      val timestamp : String = hbaseRecord.timestamp
      val name = Row(hbaseRecord.name.firstName,
                     hbaseRecord.name.middleName,hbaseRecord.name.lastName)
      Row(uuid, timestamp, name)
    })
 类似资料:
  • 我在网上看到了Dataframes教程https://databricks.com/blog/2015/02/17/introducing-dataframes-in-spark-for-large-scale-data-science.html这是用Python编写的。我正试图把它翻译成Scala。 它们有以下代码: 因此,我首先将数据从一个读入一个数据帧,然后我得到: 但我不知道: > 如何将

  • Serenity 实体系统是一个微 ORM,它像 Dapper 那样对 SQL 情有独钟。 不同于完全成熟的ORM,如 NHibernate/Entity Framework,Serenity 提供智能感知地映射和查询数据库所需的最小功能、编译时检查和容易的重构。 Serenity 的实体通常像 XYZRow 这样命名。它们是 Serenity.Data.Row 子类。 让我们来定义一个简单的行类

  • 描述 (Description) column和row类用于同一元素以获取用作容器的全宽列。 例子 (Example) 以下示例演示了在Foundation中使用combined column/row类 - <!DOCTYPE html> <html> <head> <title>Foundation Template</title> <meta name = "vi

  • This plugin, applied to a number of HTML tables, provides the behaviour of resizing their rows by clicking over a "handler hint"

  • 我有一个数据帧,它有一个数组类型的复杂列数据类型

  • 我正在尝试为我的JTable创建行标题。我在这里和这里做过研究,但几乎什么都没有。我的发现并没有保持系统的外观。 到目前为止,我发现: 第一列(没有名字的那列)是我能做到的最好的一列。我使用了表头渲染器,并将其应用于行单元格。这在一定程度上起了作用。正如您所见,降序/升序排序的小箭头图标出现在列的每个单元格中,单元格现在为灰色。除此之外,这是一次彻底的失败。此外,我不希望我的行标题中有任何箭头图标