首页 > 解决方案 > 如何修剪pyspark数据框中的选择性字段列表

问题描述

我有一个火花数据框,并且我有一个需要修剪的选择性字段列表。在生产中,这个字段列表会因每个数据集而异。我正在尝试编写一段通用的代码来为我做这件事。这是我到目前为止所做的-

df = sqlContext.createDataFrame([('abcd    ','123    ','x  ')], ['s', 'd', 'n'])
df.show()
+--------+-------+---+
|       s|      d|  n|
+--------+-------+---+
|abcd    |123    |x  |
+--------+-------+---+

我所有的 3 个属性都有尾随空格。但是我只想从“s”列和“d”列中修剪空格。

>>> col_list=['s','d']
>>> df.select(*map(lambda x: trim(col(x)).alias(x),col_list)).show()
+----+---+
|   s|  d|
+----+---+
|abcd|123|
+----+---+

如果我将列表传递给这个 lambda,上述操作确实为我修剪了空间。

我如何选择剩余的列?我试过这些-

>>> df.select('*',*map(lambda x: trim(col(x)).alias(x),col_list)).show()
+--------+-------+---+----+---+
|       s|      d|  n|   s|  d|
+--------+-------+---+----+---+
|abcd    |123    |x  |abcd|123|
+--------+-------+---+----+---+

>>> df.select(*map(lambda x: trim(col(x)),col_list),'*').show()
  File "<stdin>", line 1
SyntaxError: only named arguments may follow *expression

如何在不进行硬编码的情况下从此 Dataframe 中选择其他属性?

标签: apache-sparkpysparkapache-spark-sql

解决方案


你可以这样做:

#create a list of all columns which aren't in col_list and concat it with your map
df.select(*([item for item in df.columns if item not in col_list] + list(map(lambda x: F.trim(col(x)).alias(x),col_list))) ).show()

但出于可读性目的,我会推荐withColumn

for c in col_list:
    df = df.withColumn(c, F.trim(F.col(c)))

df.show()

推荐阅读