计算从Parquet文件读取的两个Spark DataFrame中列值之间的差异的最佳方法

时间:2019-02-07 21:24:28

标签: apache-spark apache-spark-sql partitioning parquet

我需要阅读两个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)上两个数据帧的内容,但这是避免其他数据改组的正确方法吗?

0 个答案:

没有答案