在 pySpark (2.3) 中读取本地 csv 文件

Posted

技术标签:

【中文标题】在 pySpark (2.3) 中读取本地 csv 文件【英文标题】:read local csv file in pySpark (2.3) 【发布时间】:2018-07-11 14:58:02 【问题描述】:

我正在使用 pySpark 2.3,试图读取如下所示的 csv 文件:

0,0.000476517230863068,0.0008178378961061477
1,0.0008506156837329876,0.0008467260987257776

但它不起作用:

from pyspark import sql, SparkConf, SparkContext
print (sc.applicationId)
>> <property at 0x7f47583a5548>
data_rdd = spark.textFile(name=tsv_data_path).filter(x.split(",")[0] != 1)

我得到一个错误:

AttributeError: 'SparkSession' object has no attribute 'textFile'

知道我应该如何在 pySpark 2.3 中阅读它吗?

【问题讨论】:

【参考方案1】:

首先,textFile 存在于 SparkContext(repl 中称为 sc)上,而不是 SparkSession 对象(repl 中称为 spark)上。

其次,对于 CSV 数据,我建议使用 CSV DataFrame 加载代码,如下所示:

df = spark.read.format("csv").load("file:///path/to/file.csv")

您在 cmets 中提到需要将数据作为 RDD。如果您可以将所有操作保留在 DataFrames 而不是 RDDs 上,您将获得明显更好的性能。但是,如果您出于某种原因需要回退到 RDD,您可以这样做:

rdd = df.rdd.map(lambda row: row.asDict())

采用这种方法比尝试使用 textFile 加载它并自己解析 CSV 数据要好。如果您使用DataFrame CSV 加载,那么它将为您正确处理所有 CSV 边缘情况,例如引用字段。此外,如果只需要某些列,您可以在将 DataFrame 转换为 RDD 之前对其进行过滤,以避免需要将所有额外数据带入 python 解释器。

【讨论】:

但这会产生 Dataframe 对吧?我需要 RDD 为什么特别需要 RDD?如果您使用 python,DataFrames 将为您提供更好的性能。如果您真的想这样做,我将更新示例,说明如何转换为 RDD。 试试DataFrame.rdd

以上是关于在 pySpark (2.3) 中读取本地 csv 文件的主要内容,如果未能解决你的问题,请参考以下文章

无法从 S3 读取 csv 到 AWS 上 EC2 实例上的 pyspark 数据帧

如何在 pyspark 数据框中读取 csv 文件时读取选定的列?

如何在 pyspark 中启用 csv 文件的多行读取

在 Pyspark 中读取 CSV 文件引发错误 FileNotFound 错误

PySpark:读取 pyspark 框架中的 csv 数据。为啥它在框架中显示特殊字符?除了使用熊猫之外,以表格形式显示的任何方式[重复]

为啥有两个选项可以在 PySpark 中读取 CSV 文件?我应该使用哪一个?