使用 pyspark 从 CSV 文件中拆分字段

Posted

技术标签:

【中文标题】使用 pyspark 从 CSV 文件中拆分字段【英文标题】:Splitting fields from a CSV file using pyspark 【发布时间】:2019-12-11 22:32:23 【问题描述】:

我在通过 PySpark 拆分 CSV 文件时遇到问题。我正在尝试输出酒的国家和名称(这只是为了证明解析有效),但出现错误。

这是 CSV 文件的外观:

,国家,描述,名称,积分,价格,省份,region_1,region_2,品种,酒厂

20,美国,“Heitz 自 1961 年以来就用稀有的 Grignolino 葡萄酿制了这款一流的桃红葡萄酒。宝石红葡萄柚红色,带有草莓、西瓜、橙皮和咸味香料的味道,散发着浓郁的花香。”,Grignolino ,95,24.0,California,Napa Valley,Napa,Rosé,Heitz

这是我的代码

from pyspark import SparkConf, SparkContext

conf = SparkConf().setMaster("local").setAppName("SQLProject")
sc = SparkContext(conf = conf)


def parseLine(line):
    fields = line.split(',')
    country = fields[1]
    points = fields[4]
    return country, points


lines = sc.textFile("file:///Users/luisguillermo/IE/Spark/Final Project/wine-reviews/winemag-data-130k-v2.csv")
rdd = lines.map(parseLine)

results = rdd.collect()

for result in results:
    print(result)

并得到这个错误:

  File "/Users/luisguillermo/IE/Spark/Final Project/wine-reviews/country_and_points.py", line 10, in parseLine
    points = fields[4]
IndexError: list index out of range

由于描述中有逗号,程序似乎变得混乱。有关如何解决此问题的任何想法?

【问题讨论】:

为什么不使用 spark 的内置 CSV 阅读器:spark.apache.org/docs/2.4.4/api/python/…. 可能有问题,因为你在,上拆分,并且你的描述中有, 我同意@DrChess,为什么不为此使用适当的 csv 库? 【参考方案1】:

我建议使用 Spark 内置的 CSV 数据源,因为它提供了许多选项,包括用于从列中读取分隔符的 quotes,当然,带有分隔符的列应该用一些字符引用。

引用

当您有一列带有用于拆分列的分隔符时,请使用引号选项指定引号字符,默认情况下它是 ” 并且引号内的分隔符将被忽略。但是使用这个选项你可以设置任何字符。

如果您想阅读 Spark CSV 提供的其他选项以及示例,我建议您阅读以下文章。

spark-read-csv-file-into-dataframe

read-csv

学习愉快!!

【讨论】:

【参考方案2】:

查看此代码:

df = spark.read\
    .csv('data.csv')

df.printSchema()
df.show()

生成的 df 是一个 DataFrame,其列与 CSV 类似。 查看更多高级功能here

【讨论】:

以上是关于使用 pyspark 从 CSV 文件中拆分字段的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark - 将数据帧写入 2 个不同的 csv 文件

使用 pyspark 处理 csv 文件中字段中的逗号

导出为 CSV 文件时分号拆分字段?

如何从 pyspark 数据框中更快地保存 csv 文件?

使用拆分列将 RDD 写入 csv

从 CSV 文件中删除字符