PySpark 2.4-使用自定义行分隔符读取CSV文件

时间:2019-02-18 18:11:45

标签: python csv apache-spark pyspark text-parsing

在2017年增加了对自定义行分隔符(用于各种文本文件格式)的支持(请参阅:https://github.com/apache/spark/pull/18581)。

...或者可能是在2017年没有添加-甚至从来没有(请参阅:https://github.com/apache/spark/pull/18304

今天,在Pyspark 2.4.0中,我无法使用自定义行分隔符来解析CSV文件。

以下是一些代码:

Cannot infer type argument(s) for <R> flatMap(Function<? super T,? extends Stream<? extends R>>)

这是两个示例csv文件: one.csv-行由换行字符'0A'

分隔
from pyspark.sql.types import (
    StructType,
    StructField,
    StringType
)

list_structs = StructType([StructField('id', StringType(), True),StructField('desc', StringType(), True)])

df = spark.read.load("mnt/one.csv",
                     format="csv", 
                     sep="\x1e",
                     schema=list_structs)
print("one.csv rowcount: {}".format(df.count()))

df2 = spark.read.load("mnt/two.csv",
                     format="csv", 
                     sep="\x1e",
                     lineSep="\x1d",
                     schema=list_structs)
print("two.csv rowcount: {}".format(df2.count()))

two.csv-行由组分隔符“ 1D”分隔

"1","foo"
"2","bar"
"3","foobar"

我希望代码的输出为: one.csv行数:3 two.csv行数:3

我收到的输出是: one.csv行数:3 two.csv行数:1

关于如何让Pyspark接受组分隔符char作为行分隔符的想法?

1 个答案:

答案 0 :(得分:0)

我可以用以下方法得到想要的结果:

"1","foo""2","bar""3","foobar"

这取决于熊猫,并且这里的数据可能会被读取两次(我不确定从熊猫dataFrame创建RDD时内部会发生什么情况。)