Apache spark 使用SparkSQL按年/月/日获取分区中的最新日期

Apache spark 使用SparkSQL按年/月/日获取分区中的最新日期,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我正在尝试使用Spark SQL将源表中的新分区增量转换为新表。源和目标中的数据按如下方式进行分区:/data/year=YYYY/month=MM/day=DD/。我最初只是想选择最大值年,月和日来获取最新分区,但这显然是错误的。有什么好办法吗 如果我构造一个日期并取max,比如max(CONCAT(年,'-',月,'-',日)::date)这将是非常无效的,对吗?因为它需要扫描所有数据才能提取最新的分区。请尝试下面的操作,以获取最新的分区,而无需读取任何数据,仅获取元数据: spark.sq

我正在尝试使用Spark SQL将源表中的新分区增量转换为新表。源和目标中的数据按如下方式进行分区:
/data/year=YYYY/month=MM/day=DD/
。我最初只是想选择最大值
来获取最新分区,但这显然是错误的。有什么好办法吗


如果我构造一个日期并取max,比如
max(CONCAT(年,'-',月,'-',日)::date)
这将是非常无效的,对吗?因为它需要扫描所有数据才能提取最新的分区。

请尝试下面的操作,以获取最新的分区,而无需读取任何数据,仅获取元数据:

spark.sql("show partitions <table>").agg(max('partition)).show
spark.sql(“显示分区”).agg(max('partition)).show

尝试在不读取数据的情况下获取最新分区,仅获取元数据:

spark.sql("show partitions <table>").agg(max('partition)).show
spark.sql(“显示分区”).agg(max('partition)).show

您可以使用
显示分区的结果,因为这样会更有效,因为它只会命中元存储。但是,您不能只对其中的值应用max,我们需要先构造日期,然后再进行max

以下是一个示例:

从pyspark.sql导入函数为F
df=sqlContext.sql(“显示分区”)
测向显示(10,假)
日期=F.to_日期(F.regexp_替换(F.regexp_替换(“分区”、“[a-z=]”、“)、“/”、“-”)
df.select(F.max(date).alias(“max_date”).show()
输入值:

+------------------------+
|分割|
+------------------------+
|年=2019/月=11/日=5|
|年=2019/月=9/天=5|
+------------------------+
结果:

+----------+
|  max_date|
+----------+
|2019-11-05|
+----------+

您可以使用
show partitions
的结果,因为它只会影响元存储,因此效率更高。但是,您不能只对其中的值应用max,我们需要先构造日期,然后再进行max

以下是一个示例:

从pyspark.sql导入函数为F
df=sqlContext.sql(“显示分区”)
测向显示(10,假)
日期=F.to_日期(F.regexp_替换(F.regexp_替换(“分区”、“[a-z=]”、“)、“/”、“-”)
df.select(F.max(date).alias(“max_date”).show()
输入值:

+------------------------+
|分割|
+------------------------+
|年=2019/月=11/日=5|
|年=2019/月=9/天=5|
+------------------------+
结果:

+----------+
|  max_date|
+----------+
|2019-11-05|
+----------+

选择年、月、日的最大值以获取最新分区,但这显然是错误的-为什么?只要字段顺序正确(年、月、日),就可以了。假设是2020年1月10日,然后选择最大日期。由于
MAX(day)
将是31,而
MAX(month)
是12,我将查找大于
2020-12-31的记录。要做到这一点,您需要将3个分区作为一个逻辑单元来处理。至少,我认为您是这样做的。选择年、月、日的最大值以获得最新分区,但这显然是错误的-为什么?只要字段顺序正确(年、月、日),就可以了。假设是2020年1月10日,然后选择最大日期。由于
MAX(day)
将是31,而
MAX(month)
是12,我将查找大于
2020-12-31的记录。要做到这一点,您需要将3个分区作为一个逻辑单元来处理。至少,我认为是这样。这不会为分区提供正确的结果,因为值将根据字符串值进行排序,即
year=2019/month=11/day=5
将小于
year=2019/month=9/day=5
month=MM/day=DD
,假设它是
year=2019/month=09/day=05
,这将不能为分区提供正确的结果,因为这些值将根据字符串值进行排序,即
年=2019/月=11/日=5
将小于
年=2019/月=9/日=5
月=MM/日=DD
,假设它是
年=2019/月=09/日=05
,这将是正确的排序。