对此scala spark实现感兴趣 split-column-of-list-into-multiple-columns-in-the-same-pyspark-dataframe
给出此数据框:
| X | Y|
+--------------------+-------------+
| rent|[1,2,3......]|
| is_rent_changed|[4,5,6......]|
| phone|[7,8,9......]|
我想要一个具有爆炸值并映射到我提供的col名称的新数据框:
colNames = ['cat','dog','mouse'....]
| Column|cat |dog |mouse |.......|
+--------------------+---|---|--------|-------|
| rent|1 |2 |3 |.......|
| is_rent_changed|4 |5 |6 |.......|
| phone|7 |8 |9 |.......|
尝试:
val out = df.select(col("X"),explode($"Y"))
但是格式错误,我不知道如何映射到我的colNames列表:
X | Y |
---------------|---|
rent |1 |
rent |2 |
rent |3 |
. |. |
. |. |
is_rent_changed|4 |
is_rent_changed|5 |
在上面的链接中,python解决方案是使用列表理解:
univar_df10.select([univar_df10.Column] + [univar_df10.Quantile[i] for i in range(length)])
但是,鉴于列名仅仅是列的索引,它没有显示如何使用提供的列名列表。
答案 0 :(得分:1)
我已经提出了一个基于某些假设的解决方案。
1.每个数组行将具有相同数量的元素。 2.我们在Array [String]中有列名 3.我们知道要在数组中拆分为列的期望值数。['stage_checkout', 119, 400]
['stage_wiki', 14225, 34]
['stage_upload', 1215, 250]
其中var df1 = df
是您的输入DF。例如:-
df
+---+---------+
| id| value|
+---+---------+
| 1|[A, B, C]|
| 2|[D, E, F]|
+---+---------+
val columns = Array("cat","dog","sheep")
是列名称的数组。
columns
您现在可以根据需要删除值列。希望这对您有用!
答案 1 :(得分:1)
实际上并没有那么复杂。select
期望的数据框只是Column
对象的列表,我们可以通过编程方式创建该列表:
val columns = List("cat", "mouse", "dog")
.zipWithIndex
.map{ case (header, idx) => $"y"(idx).alias(header) }
然后我们唯一需要做的就是在select
中使用它:
val df = List(("rent", Array(1,2,3)), ("is_rent_changed", Array(3,4,5))).toDF("x", "y")
df.select($"x" :: columns : _*).show()
输出:
+---------------+---+-----+---+
| x|cat|mouse|dog|
+---------------+---+-----+---+
| rent| 1| 2| 3|
|is_rent_changed| 3| 4| 5|
+---------------+---+-----+---+
当然您也可以内联它。