如何使用 pySpark 读取分区镶木地板的子样本?

How to read a sub-sample of partitioned parquets using pySpark?

假设我获得了以下镶木地板数据分区:

.
└── data/
    ├── product=soda/
    │   ├── <hash>_toto.parquet
    │   ├── ...
    │   └── <hash>.parquet
    └── product=cake/
        ├── <hash>.parquet
        └── ...

我想使用 PySpark 读取数据,但要排除包含 <hash>_toto.parquet.

的给定镶木地板列表

我可以读取整个分区数据,但我不知道如何排除其中的一些数据。我想保留 Spark 实现的功能以合并数据并在此处使用以下代码创建列 product :

from pyspark.sql import SparkSession, SQLContext
# this code read all parquets, merge them, and create a column product
spark = SparkSession.builder \
                    .master("local") \
                    .appName("app") \
                    .config("spark.executor.memory", "5gb") \
                    .config("spark.cores.max", "6") \
                    .getOrCreate()
sc = spark.sparkContext
sqlContext = SQLContext(sc)
dataframe = sqlContext.read.parquet("./data")

使用input_file_name函数过滤掉来自文件名中包含'hash'的文件的行:

from pyspark.sql import functions as F

df = sqlContext.read.parquet("./data")

df = df.filter(~F.input_file_name().rlike('hash'))

您可以将布尔列 toto 添加到您的数据框中,然后 partitionBy('toto')。然后你得到子文件夹 toto=True/ 和 toto=False/.

读取完整文件夹后,您可以简单地 运行 `.where('toto == False') 来防止 Spark 读取这些镶木地板。