【问题标题】:Do Spark/Parquet partitions maintain ordering?Spark/Parquet 分区是否保持有序?
【发布时间】:2019-07-29 23:02:48
【问题描述】:

如果我对数据集进行分区,当我读回它时,它的顺序是否正确?例如,考虑以下 pyspark 代码:

# read a csv
df = sql_context.read.csv(input_filename)

# add a hash column
hash_udf = udf(lambda customer_id: hash(customer_id) % 4, IntegerType())
df = df.withColumn('hash', hash_udf(df['customer_id']))

# write out to parquet
df.write.parquet(output_path, partitionBy=['hash'])

# read back the file
df2 = sql_context.read.parquet(output_path)

我正在对 customer_id 存储桶进行分区。当我读回整个数据集时,是否保证分区按原始插入顺序重新合并在一起?

现在,我不太确定,所以我要添加一个序列列:

df = df.withColumn('seq', monotonically_increasing_id())

但是,我不知道这是否是多余的。

【问题讨论】:

标签: apache-spark pyspark parquet


【解决方案1】:

不,不能保证。即使是很小的数据集也可以尝试:

df = spark.createDataFrame([(1,'a'),(2,'b'),(3,'c'),(4,'d')],['customer_id', 'name'])

# add a hash column
hash_udf = udf(lambda customer_id: hash(customer_id) % 4, IntegerType())
df = df.withColumn('hash', hash_udf(df['customer_id']))

# write out to parquet
df.write.parquet("test", partitionBy=['hash'], mode="overwrite")

# read back the file
df2 = spark.read.parquet("test")
df.show()

+-----------+----+----+
|customer_id|name|hash|
+-----------+----+----+
|          1|   a|   1|
|          2|   b|   2|
|          3|   c|   3|
|          4|   d|   0|
+-----------+----+----+
df2.show()

+-----------+----+----+
|customer_id|name|hash|
+-----------+----+----+
|          2|   b|   2|
|          1|   a|   1|
|          4|   d|   0|
|          3|   c|   3|
+-----------+----+----+

【讨论】:

    猜你喜欢
    • 2016-09-07
    • 2016-01-06
    • 2019-03-02
    • 2015-11-28
    • 1970-01-01
    • 2018-11-22
    • 2017-03-29
    • 2017-12-02
    • 1970-01-01
    相关资源
    最近更新 更多