首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PySpark:过滤掉所有列多于表头行的行

PySpark:过滤掉所有列多于表头行的行
EN

Stack Overflow用户
提问于 2021-01-27 23:14:12
回答 1查看 204关注 0票数 0
代码语言:javascript
复制
df = spark.read.csv('input.csv', header=True, inferSchema=True)

假设'input.csv‘文件包含以下数据:

代码语言:javascript
复制
id, name, age
1, John, 20
2, Mike, 33
3, Phil, 19, 180, 78
4, Sean, 40

我想过滤掉比标题包含更多列的行,并将其保存到不同的输出中,有点像这样(说明性地):

代码语言:javascript
复制
df2 = df.filter(condition1) #condition1 = rows which have more columns than header
df = df.filter(condition2) #condition2 = rows which have same amount or less columns than header
df.show()
df2.show()

因此,我将得到如下输出:

代码语言:javascript
复制
+---+------+----+
| id|  name| age|
+---+------+----+
|  1|  John|  20|
|  2|  Mike|  33|
|  4|  Sean|  40|
+---+------+----+


+---+------+----+
| id|  name| age|
+---+------+----+
|  3|  Phil|  19|
+---+------+----+

到目前为止我什么也没找到。目前,它只是缩小行以适合标题,而没有办法获得它。我能做什么?谢谢

编辑:模式不一定需要是"id","name“,"age”。它应该从字面上接受任何内容,因此过滤不能依赖于特定的列。此外,解决方案不能排他于特定类型的读取,数据将根据用户选择的内容接收,唯一可以修改的是参数和选项。

EN

回答 1

Stack Overflow用户

发布于 2021-01-27 23:24:36

您可以将其作为文本文件读取,并查找每行中的列数。获取具有3个以上列的行的id的df。然后使用id对数据帧(通过read.csv获得)执行semianti连接。

代码语言:javascript
复制
text = spark.read.text('input.csv')
textdf = text.selectExpr(
    "value",
    "size(split(value, ',')) len",
    "split(value, ',')[0] id"
).filter('len > 3')

textdf.show()
+----------------+---+---+
|           value|len| id|
+----------------+---+---+
|3,Phil,19,180,78|  5|  3|
+----------------+---+---+


df = spark.read.csv('input.csv', header=True)

df1 = df.join(textdf, 'id', 'anti')
df2 = df.join(textdf, 'id', 'semi')

df1.show()
+---+----+---+
| id|name|age|
+---+----+---+
|  1|John| 20|
|  2|Mike| 33|
|  4|Sean| 40|
+---+----+---+

df2.show()
+---+----+---+
| id|name|age|
+---+----+---+
|  3|Phil| 19|
+---+----+---+
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65921993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档