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))]
的数组,我想将其转换为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]|
+---+-----+
或者您可以自定义列信息,如下所示:
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)