暂无说说

spark读写Parquet

pyspark jiajun 8个月前 (03-03) 138次浏览 0个评论 扫描二维码

Spark SQL 可以支持 Parquet、JSON、Hive 等数据源,并且可以通过 JDBC 连接外部数据源。这里介绍 spark 读取 Parquet。

Parquet 是一种流行的列式存储格式,可以高效地存储具有嵌套字段的记录。Parquet 是语言无关的,而且不与任何一种数据处理框架绑定在一起,适配多种语言和组件,能够与 Parquet 配合的组件有:
查询引擎: Hive, Impala, Pig, Presto, Drill, Tajo, HAWQ, IBM Big SQL
计算框架: MapReduce, Spark, Cascading, Crunch, Scalding, Kite
数据模型: Avro, Thrift, Protocol Buffers, POJOs
Spark 已经为我们提供了 parquet 样例数据,在安装目录的“examples/src/main/resources/”子目录下有个 users.parquet 文件,这个文件格式比较特殊,如果直接用 vim 编辑器打开,或者用 cat 命令查看文件内容,会出现一堆乱码。只有被加载到程序中以后,Spark 会对这种格式进行解析,然后我们才能理解其中的数据。
下面代码演示了如何从 parquet 文件中加载数据生成 DataFrame。

from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
parquetFileDF = spark.read.parquet("file:///soft/spark/examples/src/main/resources/users.parquet")
parquetFileDF.createOrReplaceTempView("parquetFile")
namesDF = spark.sql("SELECT * FROM parquetFile")
namesDF.rdd.foreach(lambda person: print(person.name))

下面介绍如何将 DataFrame 保存成 parquet 文件。

peopleDF = spark.read.parquet("file:///soft/spark/examples/src/main/resources/users.parquet")
peopleDF.write.parquet("file:///home/hadoop/newpeople.parquet")

上述过程执行结束后,在 Shell 命令提示符下查看新生成的 newpeople.parquet:

cd /home/hadoop
ls

上面命令执行后,可以看到”/home/hadoop”这个目录下多了一个 newpeople.parquet,不过,注意,这不是一个文件,而是一个目录(不要被 newpeople.parquet 中的圆点所迷惑,文件夹名称也可以包含圆点),也就是说,peopleDF.write.parquet("file:///home/hadoop/newpeople.parquet")括号里面的参数是文件夹,不是文件名。下面我们可以进入 newpeople.parquet 目录,会发现下面 2 个文件:

part-00000-7ff3119a-3581-4a2f-aa91-1a4abbf6c79b-c000.snappy.parquet
 _SUCCESS

这 2 个文件都是刚才保存生成的。现在问题来了,如果我们要再次把这个刚生成的数据又加载到 DataFrame 中,应该加载哪个文件呢?很简单,只要加载 newpeople.parquet 目录即可,而不是加载这 2 个文件,语句如下:

from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
users = spark.read.parquet("file:///home/hadoop/newpeople.parquet")
users.show()

 

喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址