【发布时间】:2020-07-04 07:51:59
【问题描述】:
我有两张桌子。这两个表都是 hive 中的外部表,以 parquet 数据格式存储。
第一个表 table_1 从 2015 年开始每天有 2.5 亿 行。该表根据 create_date 进行分区。所以对于每个 create_date,大约有 250M 行。
第二张表 - table_2 是每日增量表,平均行数约为 150 万 行。
两个表中有一个共同的列“lookup_id”。现在我需要使用数据框从 table_1 中获取所有列以获取 table_2 中的增量数据。
我想过做下面这样的事情
table_1=spark.table("table_1")
table_2=spark.table("table_2")
result_df=table_1.join(table_2, table_1.lookup_id=table_2.lookup_id, "inner").drop(table_2.lookup_id)
但我怀疑这是否真的有效,以及 pyspark 是否能够在没有任何内存错误的情况下处理这个问题。
问题 1: 如何根据 create_date 分区并行化 table_1 扫描?
问题 2: 有没有其他方法可以根据 table_2 中的 lookup_ids 和/或基于分区优化 table_1 扫描?
更多信息让我更清楚地了解我在寻找什么:
我试图了解当我们使用数据帧连接表时,火花是否读取数据并将其保存在内存中并加入它们,或者它只是在读取自身时加入。如果第二个为真,则第二个语句适用的所有联接是什么。另外,如果需要使用循环来避免任何内存错误。
【问题讨论】:
-
table1.create_date和table2.create_date之间有什么关系吗?例如,如果row1.lookup_id == row2.lookup_id然后row1.create_date == row2.create_datefor row1 ∈ table1 和 row2 ∈ table2 是真的吗? -
不,只有 lookup_id 可用。 create_date 不可用
标签: apache-spark pyspark apache-spark-sql pyspark-dataframes