Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark delta lake中分区数据的高效读取/转换_Apache Spark_Pyspark_Apache Spark Sql_Delta Lake - Fatal编程技术网

Apache spark delta lake中分区数据的高效读取/转换

Apache spark delta lake中分区数据的高效读取/转换,apache-spark,pyspark,apache-spark-sql,delta-lake,Apache Spark,Pyspark,Apache Spark Sql,Delta Lake,我把我的数据放在ADLS的一个三角洲湖中,并通过数据库读取数据。数据按年份和日期进行分区,z按storeIdNum排序,其中大约有10个store Id,每个Id每个日期有几百万行。当我读取它时,有时我读取一个日期分区(约2000万行),有时我读取整整一个月或一年的数据来执行批处理操作。我有第二个小得多的表,每个日期大约75000行,也是按storeIdNum z排序的,我的大多数操作涉及将较大的数据表连接到storeIdNum上的较小表(以及一些其他字段,如时间窗口,较小的表是按小时汇总的,而

我把我的数据放在ADLS的一个三角洲湖中,并通过数据库读取数据。数据按年份和日期进行分区,z按storeIdNum排序,其中大约有10个store Id,每个Id每个日期有几百万行。当我读取它时,有时我读取一个日期分区(约2000万行),有时我读取整整一个月或一年的数据来执行批处理操作。我有第二个小得多的表,每个日期大约75000行,也是按storeIdNum z排序的,我的大多数操作涉及将较大的数据表连接到storeIdNum上的较小表(以及一些其他字段,如时间窗口,较小的表是按小时汇总的,而另一个表每秒都有数据点). 当我读入这些表时,我将它们连接起来,并执行一系列操作(GROUPBY、WINDOWN by和partition by,使用lag/lead/avg/DENSENCE_rank函数,等等)

我的问题是:我应该在所有联接、group by和partition by语句中都有日期吗?每当我读取一个数据日期时,我总是在语句中有读取数据的年份和日期,因为我知道我只想从某个分区(或分区的年份)读取数据,但是,为了提高效率,还必须参考windows和组总线中的分区列,还是这是多余的?在分析/转换之后,我不会覆盖/修改正在读取的数据,而是写入一个新表(可能在相同的列上分区),以防这是一个因素

例如:

dfBig = spark.sql("SELECT YEAR, DATE, STORE_ID_NUM, UNIX_TS, BARCODE, CUSTNUM, .... FROM STORE_DATA_SECONDS WHERE YEAR = 2020 and DATE='2020-11-12'")
dfSmall = spark.sql("SELECT YEAR, DATE, STORE_ID_NUM, TS_HR, CUSTNUM, .... FROM STORE_DATA_HRS WHERE YEAR = 2020 and DATE='2020-11-12'")

现在,如果我加入他们,我是想在加入中包括年份和日期,还是应该只加入STORE_ID_NUM(然后是我需要加入的任何时间戳字段/客户ID号字段)?我肯定需要STORE_ID_NUM,但如果只是添加另一列,我可以放弃年份和日期,这会使它更低效,因为它需要加入更多的内容。我不知道它到底是如何工作的,所以我想通过前面的连接来检查,可能是因为我在执行操作时没有利用分区,所以我使它更加低效?谢谢大家!

使用delta的关键是很好地选择分区列,这可能需要一些尝试和错误,如果您想优化响应的性能,我学到的一种技术是选择基数较低的筛选器列(你知道,如果问题是时间序列,它将是日期,另一方面,如果它是关于所有客户的报告,那么选择你的城市可能很方便),记住,如果你使用delta,每个分区代表文件结构的一个级别,其基数将是目录数

在您的例子中,我发现按年份进行分区很好,但是我会添加月份,因为它会在一定程度上有助于spark的动态修剪

如果表与其他表相比非常小,则可以尝试使用BRADCAST联接

后一个链接解释了动态修剪如何帮助合并操作