如何使用PySpark读取HDFS中的Parquet文件及指定格式的Hive外部表文件
嘿,这两个PySpark读取Parquet的问题我经常碰到,给你详细拆解下:
Q1: 如何使用PySpark读取HDFS上存储的Parquet文件?
PySpark提供了非常直接的API来搞定这个需求,步骤很清晰:
- 初始化SparkSession:这是PySpark程序的入口,确保你的Spark环境已经配置好HDFS相关参数(比如namenode地址)
from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("Read HDFS Parquet") \ .getOrCreate()
- 用
read.parquet()读取文件:直接传入HDFS路径即可,路径格式为hdfs://<namenode-host>:<port>/path/to/parquet,如果Spark已经默认绑定HDFS集群,甚至可以省略hdfs://前缀直接写绝对路径
# 读取单个Parquet文件或整个目录下的Parquet文件 df = spark.read.parquet("hdfs://namenode:9000/user/data/sample_data.parquet") # 如果分区文件的Schema有差异,可开启mergeSchema参数自动合并 df = spark.read.option("mergeSchema", "true").parquet("hdfs://namenode:9000/user/data/partitioned_parquet/")
- 验证结果:用
df.show()预览数据,df.printSchema()查看结构,确认读取正常。
Q2: 读取指定Parquet格式的Hive外部表对应的HDFS文件
这种场景有两种常用方案,按需选择:
方法一:直接读取表对应的HDFS路径
首先得拿到Hive外部表的存储路径——在Hive CLI里执行DESCRIBE FORMATTED <your_table_name>;,找到Location字段的值,然后用Q1的方法读取:
# 假设从Hive查到的路径是hdfs://namenode:9000/user/hive/warehouse/mydb.db/my_external_table df = spark.read.parquet("hdfs://namenode:9000/user/hive/warehouse/mydb.db/my_external_table")
方法二:通过Hive元数据直接读表(更推荐)
既然是Hive外部表,直接借助Spark的Hive集成读取更省心,不用手动找路径,还能自动识别分区和表结构:
- 初始化带Hive支持的SparkSession:
spark = SparkSession.builder \ .appName("Read Hive External Table") \ .enableHiveSupport() \ .getOrCreate()
- 读取表的两种方式:
- 用Spark SQL查询:
df = spark.sql("SELECT * FROM mydb.my_external_table")
- 用
spark.table()快捷读取:
df = spark.table("mydb.my_external_table")
这种方式的优势是,表的分区规则、Schema都会直接沿用Hive的定义,做分区过滤时Spark还能自动优化查询。
内容的提问来源于stack exchange,提问作者user2492356
相关产品推荐
相关产品推荐

