假设我有一个包含客户订单的表,(仅)按
date_transaction
进行分区。我想找到 date_transaction
的最大值。
以前,我只是运行
spark.sql("SELECT MAX(date_transaction) FROM orders").first()
(幼稚的方法)。
我最近发现我可以使用
spark.sql("SHOW PARTITIONS orders").toPandas().max()
+ 一些字符串清理(显示分区方法)。
我注意到使用显示分区可以使该过程更快,因为 Spark 不需要扫描整个表。
我能想到的一个缺点是,如果最大日期事务中没有数据,显示分区仍将返回它,而天真的方法将返回正确的日期(是否可能有空分区?)。
我想知道显示分区方法是否还有其他我没有想到的缺点。
非常感谢您的意见。谢谢您,祝您有美好的一天。
如果您使用
SHOW PARTITIONS
方法,它将 返回所有分区值(即使其中某些分区中没有数据),
而
SELECT MAX(date_transaction)
方法可确保仅考虑非空分区。
# You can combine the 2 apporaches with if else condition
max_partition = spark.sql("SHOW PARTITIONS orders").toPandas()['partition'].max()
import re
max_partition_date = re.search(r'date_transaction=(\d{4}-\d{2}-\d{2})', max_partition).group(1)
result = spark.sql(f"SELECT COUNT(*) FROM orders WHERE date_transaction = '{max_partition_date}'").first()
if result[0] > 0:
print(f"The maximum date with data is: {max_partition_date}")
else:
max_date_with_data = spark.sql("SELECT MAX(date_transaction) FROM orders").first()[0]
print(f"The maximum date with actual data is: {max_date_with_data}")