Перегородки Spark / Parquet поддерживают порядок? - PullRequest
2 голосов
/ 08 марта 2019

Если я разделю набор данных, будет ли он в правильном порядке, когда я читаю его обратно? Например, рассмотрим следующий код 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())

Однако я не знаю, является ли это излишним.

1 Ответ

2 голосов
/ 10 марта 2019

Нет, это не гарантировано.Попробуйте даже с небольшим набором данных:

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|
+-----------+----+----+
...