pyspark 如何将函数与select一起使用以批处理选择列

bzzcjhmw  于 2022-11-21  发布在  Spark
关注(0)|答案(2)|浏览(129)

我想从 Dataframe 中选择列,
但是,我希望从配置文件中获取名称和别名,并使其保持可变。

conf

"data":
{
    "a":"a",
    "b":"great",
    "c":"example"
}

现在,我可以按如下方式选择列:

from pyspark import functions as F
df= df.select
(
F.col("a").alias("a"),
F.col("b").alias("great"),
F.col("c").alias("example)
)

但我更愿意在一个循环中做。就像

For all data.items(), do df=df.select(F.col(item[0]).alias(item[1]))

但是我不能理解它(也许我应该早点睡觉)谢谢

3vpjnl9f

3vpjnl9f1#

您可以使用df.select([F.col(k).alias(v) for k, v in data.items()])
完整示例:

df = spark.createDataFrame(data=[ ["s1", 10, True], ["s2", 20, False] ], schema=["a", "b", "c"])

[Out]:
+---+---+-----+
|  a|  b|    c|
+---+---+-----+
| s1| 10| true|
| s2| 20|false|
+---+---+-----+

data = {
    "a":"a",
    "b":"great",
    "c":"example"
}

df = df.select([F.col(k).alias(v) for k, v in data.items()])

[Out]:
+---+-----+-------+
|  a|great|example|
+---+-----+-------+
| s1|   10|   true|
| s2|   20|  false|
+---+-----+-------+
kwvwclae

kwvwclae2#

您可以对dict项进行列表解析。
下面是一个示例

cols = {
    "a":"a",
    "b":"great",
    "c":"example"
}

spark.sparkContext.parallelize([(1, 2, 3)]).toDF(['a', 'b', 'c']). \
    selectExpr(*['{0} as {1}'.format(item[0], item[1]) for item in cols.items()]). \
    show()

# +---+-----+-------+
# |  a|great|example|
# +---+-----+-------+
# |  1|    2|      3|
# +---+-----+-------+

相关问题