将清单的spark DF列拆分为单独的列

时间:2019-08-28 10:59:11

标签: scala dataframe apache-spark apache-spark-sql

对此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)])

但是,鉴于列名仅仅是列的索引,它没有显示如何使用提供的列名列表。

2 个答案:

答案 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|
+---------------+---+-----+---+

当然您也可以内联它。