Spark DataFrame将struct< ..包装到struct<的数组中

时间:2017-08-04 06:09:22

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

我试图修改由外部库生成的Dataframe。 我收到了一个包含此架构的Dataframe:

root
 |-- child: struct (nullable = true)
 |    |-- child_id: long (nullable = true)

我想将上面的 child 结构包装到 Array 中,如下面的框所示。

root
 |-- child: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- child_id: long (nullable = true)

我试图定义一个UDF:

//the two lines below are an example, in real i get the Dataframe from an  external library. 
val seq = sc.parallelize(Seq("""{ "child": { "child_id": 1}}"""))
val df = sqlContext.read.json(seq)

val myUDF = udf((x: Row) => Array(x))
val df2 = df.withColumn("children",myUDF($"child"))

但我得到一个例外:" 类型org.apache.spark.sql.Row的架构不支持"

我正在使用 Spark 2.1.1

真正的DataFrame非常复杂,是否有一个解决方案允许修改架构而不列出子表中字段的名称或位置?出于同样的原因,我也不想映射到明确的案例类。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

您可以使用array内置功能获得所需的结果

import org.apache.spark.sql.functions._
val df2 = df.withColumn("child", array("child"))

这将更新同一列,如果您希望它在单独的列中,则执行

import org.apache.spark.sql.functions._
val df2 = df.withColumn("children", array("child"))