apache-spark - 如何修剪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 中选择其他属性?
解决方案
你可以这样做:
#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()
推荐阅读
- r - R:xts 时间戳与真实数据时间戳相差 1 毫秒
- database - 如何使用 where 子句从 cassandra 表中获取最大值
- grafana - 普罗米修斯警报的状态页面?
- javascript - 如何改进 websocket 'onmessage'
- python - PyQt:如何用另一个窗口上的按钮刷新一个窗口上的标签?
- html - z-index 在 IE 中工作而不在 Edge 中工作
- java - 在 Java 上即时(运行时)更改语言(本地化)
- firebase - 在 recyclerview 中的项目内单击按钮刷新整个活动
- python - 如何在python运行时重新导入变量?
- javascript - 访问 Javascript 数组和对象