我需要阅读两个Parquet文件来计算其中一列称为data
的差异。
每个文件中的每一行都可以通过唯一的index
值来标识。
我想通过确保为每个Spark Executor分配相同的索引集x
来优化计算,从而不需要额外的数据改组。
当前是否正在使用partitionBy根据index
值编写Parquet文件:
import random
from pyspark.sql import *
def get_indices(n):
index_list = list(range(n))
random.shuffle(index_list)
return index_list
def get_df(name, n):
IndexNames = Row("index", "data" + "_" + name)
rows = []
for i in get_indices(n):
rows.append(IndexNames(i, name + '_' + str(i)))
return spark.createDataFrame(rows)
df_1 = get_df("one", 3)
df_2 = get_df("two", 3)
df_1.write.partitionBy('index').parquet('/tmp/krzsl/df_1.parquet')
df_2.write.partitionBy('index').parquet('/tmp/krzsl/df_2.parquet')
示例用法如下:
df_1_read = spark.read.parquet('/tmp/krzsl/df_1.parquet/')
df_2_read = spark.read.parquet('/tmp/krzsl/df_2.parquet/')
cond = [df_1_read.index == df_2_read.index]
joined_df = df_1_read.join(df_2_read, cond, 'inner').select(df_1_read.index, df_1_read.data_one, df_2_read.data_two)
display(joined_df)
我找不到一种方法来检查每个执行器(check question here)上两个数据帧的内容,但这是避免其他数据改组的正确方法吗?