如何使用Spark(pyspark)编写Parquet文件?

51

我在Spark中还比较新,一直在尝试将Dataframe转换为Parquet文件,但尚未成功。 文档 中指出可以使用write.parquet函数创建文件。但是,当我运行脚本时显示:AttributeError: 'RDD' object has no attribute 'write'

from pyspark import SparkContext
sc = SparkContext("local", "Protob Conversion to Parquet ")

# spark is an existing SparkSession
df = sc.textFile("/temp/proto_temp.csv")

# Displays the content of the DataFrame to stdout
df.write.parquet("/output/proto.parquet")

你知道如何使这个工作吗?

我使用的Spark版本是为Hadoop 2.7.3构建的Spark 2.0.1。


3
sc.textFile() 返回 RDD - mrsrinivas
1
是的,我刚意识到这一点。我刚切换到了SparkSession而不是SparkContext。 - ultraInstinct
2个回答

84

出现错误的原因是SparkContexttextFile方法返回了一个RDD,而我需要的是一个DataFrame

SparkSession在内部有一个SQLContext。所以在将CSV文件转换为parquet文件之前,我需要使用DataFrameReader正确地读取CSV文件。

from pyspark.sql import SparkSession

spark = SparkSession \
    .builder \
    .appName("Protob Conversion to Parquet") \
    .config("spark.some.config.option", "some-value") \
    .getOrCreate()

# read csv
df = spark.read.csv("/temp/proto_temp.csv")

# Displays the content of the DataFrame to stdout
df.show()

df.write.parquet("output/proto.parquet")

8
即使您的代码是正确的,您的解释也并非如此。SparkContext 不会将 CSV 文件转换为 RDD。SparkContext 中的 textFile 方法返回一个 RDD,而您需要的是一个 DataFrame,因此需要使用 SQLContext 或 HiveContext,这些都包含在 SparkSession 中,适用于 Spark 2.0 及以上版本。您是否可以更正这些信息,并接受答案以关闭问题? - eliasah
2
感谢@eliasah的反馈! - ultraInstinct
答案是针对数据框架的。我该如何将 RDD 以 Parquet 格式写入? - mnis.p
df.write.parquet 接受文件夹路径作为参数,而不是绝对路径。 - Haha
1
@eliasah,您的评论是否意味着对于 **spark 2+**,我们只需要以下两行代码将csv文件转换为Parquet格式:df = spark.read.parquet("/path/to/infile.csv") df.write.csv("/path/to/outfile.parquet" 我理解得对吗? - nam

6

你也可以使用Koalas库在Spark中编写Parquet文件。这个库非常适合喜欢Pandas语法的人。Koalas是底层为PySpark。

以下是Koalas代码:

import databricks.koalas as ks

df = ks.read_csv('/temp/proto_temp.csv')
df.to_parquet('output/proto.parquet')

嗨,@ Powers,我在使用AWS EMR时尝试安装“koalas”的最新版本(sc.install_pypi_package(“koalas”)),但在尝试导入它时提示“没有名为'koalas'的模块”。 - Sowmya
1
@Sowmya - 这个链接解释了如何在EMR环境中安装pypi软件包:https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-jupyterhub-install-kernels-libs.html。希望能帮到你! - Powers
谢谢。你回复我的评论真是太好了。我知道那个链接,只是想进行更本地化或笔记本电脑特定的安装,而不是进行系统安装。如果本地安装行不通,那就进行系统安装吧。 - Sowmya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接