如何使用 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 读取这些镶木地板。
假设我获得了以下镶木地板数据分区:
.
└── 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 读取这些镶木地板。