Scala 如何在Spark DataFrame API中重命名结构数组的元素
我有一个UDF,它返回一个元组数组:Scala 如何在Spark DataFrame API中重命名结构数组的元素,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我有一个UDF,它返回一个元组数组: val df = spark.range(1).toDF("i") val myUDF = udf((l:Long) => { Seq((1,2)) }) df.withColumn("udf_result",myUDF($"i")) .printSchema 给予 我想将结构的元素重命名为有意义的元素,而不是\u 1和\u 2,如何实现这一点?请注意,我知道返回case类的Seq将允许我给出正确的字段名,但使用Spark Noteboo
val df = spark.range(1).toDF("i")
val myUDF = udf((l:Long) => {
Seq((1,2))
})
df.withColumn("udf_result",myUDF($"i"))
.printSchema
给予
我想将结构的元素重命名为有意义的元素,而不是\u 1
和\u 2
,如何实现这一点?请注意,我知道返回case类的Seq将允许我给出正确的字段名,但使用Spark Notebook(REPL)with thread,我们在使用case类时遇到许多问题,因此我正在寻找一种不使用case类的解决方案
我使用的是Spark 2,但是对于非类型化的数据帧,解决方案也应该适用于Spark 1.6。可以强制转换udf的输出。例如,要将structfields重命名为
x
和y
,您可以执行以下操作:
类型安全:
val schema = ArrayType(
StructType(
Array(
StructField("x",IntegerType),
StructField("y",IntegerType)
)
)
)
df.withColumn("udf_result",myUDF($"i").cast(schema))
或不安全,但使用字符串参数转换为cast
df.withColumn("udf_result",myUDF($"i").cast("array<struct<x:int,y:int>>"))
重复:
df.withColumn("udf_result",myUDF($"i").cast("array<struct<x:int,y:int>>"))
root
|-- i: long (nullable = false)
|-- udf_result: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- x: integer (nullable = true)
| | |-- y: integer (nullable = true)