Apache spark 将数组[(任意,(任意,任意))]转换为具有2列的spark数据帧

Apache spark 将数组[(任意,(任意,任意))]转换为具有2列的spark数据帧,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我有一个类型为array[(Any,(Any,Any))]的数组,我想将其转换为sparkdataframe,这样第一个值出现在第一列,元组出现在第二列 val arr: Array[(Int, (Int, Int))] = Array((1,(2,3)), (4,(5,6))) spark.createDataFrame(arr).show() 将数据帧获取为: +---+-----+ | _1| _2| +---+-----+ | 1|[2,3]| | 4|[5,6]| +---+

我有一个类型为
array[(Any,(Any,Any))]
的数组,我想将其转换为spark
dataframe
,这样第一个值出现在第一列,元组出现在第二列

val arr: Array[(Int, (Int, Int))] = Array((1,(2,3)), (4,(5,6)))
spark.createDataFrame(arr).show()
将数据帧获取为:

+---+-----+
| _1|   _2|
+---+-----+
|  1|[2,3]|
|  4|[5,6]|
+---+-----+
或者您可以自定义列信息,如下所示:

spark.createDataFrame(arr, schema:StructType)

我希望这将对您有所帮助。

首先
DataFrame
对象有一个强大的模式-您可以将
RDD
Seq
隐式转换为
DataFrame
,但它将为您的集合附加一个强大的模式。由于
Any
类型只是表示我不知道我的类型是什么的一种方式,因此在将其作为
数据帧的一部分之前,必须将其强制转换为某个特定类型

假设您将所有内容转换为
字符串

import spark.implicits._
val df  = Array.empty[(Any, (Any, Any))]
  .map{case (first, (second, third)) => 
       (first.toString, (second.toString, third.toString))
  }.toSeq.toDF

df.printSchema
给予


到目前为止,您尝试了什么?我无法更改此类型的数组,因为它属于任何类型。我也尝试过将其转换为序列。您可能应该首先修复数组,使其不包含
Any
类型,因为Spark列不能是
Any
。数组是如何创建的?这不是数组的模式。它是任何类型的。我收到以下错误java.lang.UnsupportedOperationException:任何类型的架构不受支持Schema不是数组,是StructType,或者您可以使用spark.createDataFrame(arr).WithColumnRename(“\u 1”,“a”)。WithColumnRename(“\u 2”,“b”)
root
 |-- _1: string (nullable = true)   
 |-- _2: struct (nullable = true)  
 |    |-- _1: string (nullable = true)
 |    |-- _2: string (nullable = true)