Spark / Scala:具有结构类型

时间:2017-05-28 13:05:37

标签: scala apache-spark-sql spark-dataframe

我有这样的输入。

输入:

|customerId|Header     |Line     |
|1001      |1001aa     |1001aa1  |
|1001      |1001aa     |1001aa2  |
|1001      |1001aa     |1001aa3  |
|1001      |1001aa     |1001aa4  |
|1002      |1002bb     |1002bb1  |
|1002      |1002bb     |1002bb2  |
|1002      |1002bb     |1002bb3  |
|1002      |1002bb     |1002bb4  |
|1003      |1003cc     |1003cc1  |
|1003      |1003cc     |1003cc2  |
|1003      |1003cc     |1003cc3  |
+----------+-----------+---------+

我希望输出的类型为enter image description here

使用Dataframe和UDF我能够做到这一点 enter image description here  但我想在struct Datatype中也有这些列名。任何帮助表示赞赏。

 val udfHeaderLineList1 = udf((header:String,line:Seq[String])=>{
  line.map(records=>List(header,records)).toList
})


val eventingDFtable = my_dataframe_data_Table.
  groupBy(col("customerId"), col("header")).
  agg(collect_list(col("Line")).alias("Line")).
 withColumn("TransHeaderStruct",udfHeaderLineList1(col("header"),col("Line"))).printSchema

1 个答案:

答案 0 :(得分:1)

我通过创建案例类

得到了这个解决方案
case class simpleCaseClass (header:String,line:String)

val udfHeaderLineList3 = udf((header:String,line:Seq[String])=>{
      line.map(records=>List(header ,records)).map(value=>simpleCaseClass(value(0),value(1)))
    }