我正在使用 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”要做的事情是什么。
如这篇文章中所示,您可以在列上使用
rlike
函数,使用您现在用于迭代收集的数据帧的正则表达式来过滤数据帧。自 Spark 3.5.0 以来,另一个选项是 pyspark.sql.functions.regexp_like
或 pyspark.sql.functions.regexp
函数。
我不认为有更多的“pyspark 事情要做”,正如你所描述的,因为你的问题在我看来根本不标准。我唯一能想到的就是,如果您所需的数据位于一组固定的行中,则只需考虑这些行并验证它是否符合预期,因为它根本就不是标准的。如果您的场景中可能出现这种情况,那么这可能是一种进行预处理的好方法。