在 pyspark(不寻常的数据格式)中迭代/解析 df.collect() 的最佳方法是什么?

问题描述 投票:0回答:1

我正在使用 Databricks pyspark,读取 s3 对象,但它不是通常的 CSV。它在文件中间有标题和数据,所以我像这样读它。

df = (spark.read
    .format("text")
    .option("mode", "PERMISSIVE")
    .option("header", "false")
    .option("inferSchema","false")...

所以 df.collect() 给了我:

[Row(value=':::::'),
 Row(value='./some_file_name.csv'),
 Row(value=':::::'),
 Row(value='col_one|col_two|col_three'),
 Row(value='1|2|3'),
 Row(value='./another_file.csv'),
 Row(value='more stuff|of|varying|length')]

我需要获取 col_one、col_two 以及紧随其后的 1、2、3 等行。

我可以作为列表进行迭代并执行正则表达式,但是有更有效或更优选的方法吗?我知道迭代数据帧被认为是低效的。

数据量不是很大,所以我不关心时间/资源。只是想知道最“pyspark”要做的事情是什么。

dataframe amazon-s3 pyspark databricks
1个回答
0
投票

这篇文章中所示,您可以在列上使用

rlike
函数,使用您现在用于迭代收集的数据帧的正则表达式来过滤数据帧。自 Spark 3.5.0 以来,另一个选项是
pyspark.sql.functions.regexp_like
pyspark.sql.functions.regexp
函数。

我不认为有更多的“pyspark 事情要做”,正如你所描述的,因为你的问题在我看来根本不标准。我唯一能想到的就是,如果您所需的数据位于一组固定的行中,则只需考虑这些行并验证它是否符合预期,因为它根本就不是标准的。如果您的场景中可能出现这种情况,那么这可能是一种进行预处理的好方法。

© www.soinside.com 2019 - 2024. All rights reserved.