【问题标题】:Prevent commas in open text columns from messing up spark read csv防止打开文本列中的逗号弄乱 spark read csv
【发布时间】:2022-01-20 16:28:07
【问题描述】:

我有一个 CSV 目录,其中包含一些没有引号的文本列(我无法控制,因为这些来自外部源)。这些打开的文本列中有逗号,因此阅读它们会导致问题。如何正确转义它们,以免 spark 不会将它们解释为新列?

示例代码和数据:

file1 = spark.read.option("header", "true").option("quote", "'").option("inferSchema", "true").csv("file.csv")

样本数据

另一个相关的细节是,我实际上是使用 AWS Glue 从 S3 存储桶(递归)中提取这些文件,因此不能将它们作为 pandas 数据帧读取,然后将它们转换为 spark 数据帧。上面的代码是我用来测试的一些本地数据。

有什么想法或有用的提示吗?我在这里添加了赏金,如果有任何有用的答案,我会奖励它

展开表:

ID Note Sum Status Count
1 Hello, there friend, what is going on. How are you?,,, 123 ACTIVE 56
2 yo, yo ,yo, what is up 213 INACTIVE 5
3 how are you, whats up, I'm fine. How are you,? 2 ACTIVE 123

【问题讨论】:

  • 我猜你需要先修复文件,然后才能读入数据框,可能是sc.parallelize(csv lines).map(add quote somehow).toDF() Note 之后你有什么列?
  • @Emma 不同数据类型的几列
  • Note 后面是什么?您能否在问题中以纯文本形式包含一些示例行?
  • 您实际上在 Status 列中有 56 并且在 Count 列中有 ACTIVE 吗?还有 csv 有多大?
  • @Emma 所以这是一个 CSV 目录,我希望能够从 S3 递归读取。抱歉,打错了!

标签: csv apache-spark pyspark apache-spark-sql delimiter


【解决方案1】:

我同意@blackbishop。在没有任何字符串操作的情况下读取这种类型的数据没有什么魔力。这就是为什么我问 Note 列之后是什么的原因。唯一的处理方法是更改​​分隔符或插入双引号以包裹 Note 列。

@blackbishop 展示了如何更改分隔符。这是插入双引号的稍微不同的解决方案,但其他答案已经提到了重要的事情。

rdd = spark.sparkContext.textFile("file.csv")
header = rdd.first()
rows = (rdd.filter(lambda x: x != header)
        .map(lambda x: re.sub(r'^(\d+,)(.*)(,\d+,(IN)?ACTIVE.*)', r'\1"\2"\3', x)))

df = spark.read.csv(rows).toDF('ID', 'Note', 'Sum', 'Status', 'Count')
    

如果您在备注栏中有双引号,我想您需要转义双引号(我在上面的答案中没有这样做)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 2019-07-20
    相关资源
    最近更新 更多