Scala 如何在spark中将任意长度的数组[String]转换为一行数据帧
我有一个任意长度的数组[String],如:Scala 如何在spark中将任意长度的数组[String]转换为一行数据帧,scala,apache-spark,Scala,Apache Spark,我有一个任意长度的数组[String],如: val strs = Array[String]("id","value","group","ts") 如何将其传输到DataFrame,如下所示: +-----+------+-------+----+ |_0 | _1 | _2 | _3 | +-----+------+-------+----+ | id| value| group | ts | 我尝试的解决方案是: 代码: 或 结果: +----------------
val strs = Array[String]("id","value","group","ts")
如何将其传输到DataFrame,如下所示:
+-----+------+-------+----+
|_0 | _1 | _2 | _3 |
+-----+------+-------+----+
| id| value| group | ts |
我尝试的解决方案是:
代码:
或
结果:
+--------------------+
| value|
+--------------------+
|[id, value, group...|
+--------------------+
+-----+
|value|
+-----+
| id|
|value|
|group|
| ts|
+-----+
代码:
结果:
+--------------------+
| value|
+--------------------+
|[id, value, group...|
+--------------------+
+-----+
|value|
+-----+
| id|
|value|
|group|
| ts|
+-----+
不是我想要的
我知道解决方案如下:
val data1 = List(
(1,"A","X",1),
(2,"B","X",2),
(3,"C",null,3),
(3,"D","C",3),
(4,"E","D",3)
).toDF("id","value","group","ts").show()
但是在我的例子中,数组[String]是任意长度的
val strs = Array[String]("id","value","group","ts")
val list_of_strs = List[Array[String]]() :+ strs
spark.sparkContext.parallelize(list_of_strs)
.map { case Array(s1,s2,s3,s4) => (s1,s2,s3,s3) }
.toDF().show()
问题显然是创建一个包含单个元素的列表,而该元素也是一个集合。我想解决办法是先创建一个空列表,然后添加单个元素
与更新一样,问题似乎在于我们没有处理元组,这也可能有效:
val strs = Array[String]("id","value","group","ts")
spark.sparkContext.parallelize(List(strs))
.map { case Array(s1,s2,s3,s4) => (s1,s2,s3,s3) }
.toDF().show()
但我不认为我们可以处理任意长度的数组,因为这将导致任意长度的元组。。。这是没有意义的,因为对于数据帧,我们还处理固定定义的行(列数和列类型)。如果真的发生了这种情况,您将不得不用空格填充剩余的元组项,并使用最大的元组。有大量资源可供谷歌搜索。我尝试了答案,但可能与@shaido的答案重复。问题是海报以数组[String]的变量开头,并且不希望重写以直接嵌入序列作为
.parallelize(列表(“a”、“b”、“c”))
。这将构成硬编码。。。至少我想这就是我的意图。Henced引用的帖子也不会回答。@YoYo是的,你是对的,列表(“a”、“b”、“c”)
在这里不起作用,因为数组或列表是任意长度的,我们不知道长度和值。您的代码得到的结果与:+--------------+\value+-----------+|[id、值、组…|+-----------+
进行了更新,试图首先将数组映射到元组。
val strs = Array[String]("id","value","group","ts")
spark.sparkContext.parallelize(List(strs))
.map { case Array(s1,s2,s3,s4) => (s1,s2,s3,s3) }
.toDF().show()