Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何在Spark DataFrame API中重命名结构数组的元素_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

Scala 如何在Spark DataFrame API中重命名结构数组的元素

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

我有一个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 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)