在PySpark Dataframe中创建列,列中包含元素的名称

时间:2018-04-04 10:15:32

标签: dataframe pyspark

我有一个字符串元素列表,大约有17k个元素。我必须在数据框中创建新列,其中包含整数0作为其所有元素,列应具有列表中存在的元素的名称。

我该怎么做?

示例列表

['V1045','71752','31231']

所需格式:

ID    V1045   71752    31231
1     0       0        0
2     0       0        0
3     0       0        0
4     0       0        0

数据框有大约700,000行。

2 个答案:

答案 0 :(得分:1)

您可以轻松生成该数据:

此列表将用于列名称:

l = ['ID', 'V1045','71752','31231']

然后创建具有所需索引的范围,并将静态零用作值:

df = sc.parallelize(range(700000))\
       .map(lambda l: [l, 0, 0, 0])\
       .toDF(l)

当您致电.show()时,会返回如下内容:

+---+-----+-----+-----+
| ID|V1045|71752|31231|
+---+-----+-----+-----+
|  0|    0|    0|    0|
|  1|    0|    0|    0|
|  2|    0|    0|    0|
|  3|    0|    0|    0|
|  4|    0|    0|    0|
+---+-----+-----+-----+
only showing top 5 rows

答案 1 :(得分:0)

如果您已有数据框,添加列的最简单方法是使用withColumn()。您可以使用pyspark.sql.functions.lit()将值0添加到每一行。

例如:

l = ['V1045','71752','31231']
for new_col in l:
    df = df.withColumn(new_col, f.lit(0))

df.show(n=5)
#+---+-----+-----+-----+
#| ID|V1045|71752|31231|
#+---+-----+-----+-----+
#|  0|    0|    0|    0|
#|  1|    0|    0|    0|
#|  2|    0|    0|    0|
#|  3|    0|    0|    0|
#|  4|    0|    0|    0|
#+---+-----+-----+-----+
#only showing top 5 rows

请记住,spark是懒惰的,因此这些操作不会在循环中发生,如此处所示。

df.explain()
#== Physical Plan ==
#*Project [ID#111L, 0 AS V1045#114, 0 AS 71752#118, 0 AS 31231#123]
#+- Scan ExistingRDD[ID#111L]

您可能不应该使用sc.parallelize(range()),特别是如果您按照this post中的说明使用python 2。