如何使用 Spark SQL 创建分区表
Posted
技术标签:
【中文标题】如何使用 Spark SQL 创建分区表【英文标题】:How to create a partitioned table using Spark SQL 【发布时间】:2016-10-21 02:20:00 【问题描述】:我知道我们可以通过
创建一个自动分区发现表CREATE TABLE my_table
USING com.databricks.spark.avro
OPTIONS (path "/path/to/table");
但这需要将数据路径更改为partition_key=partition_value格式
/path/to/table/dt=2016-10-09
/path/to/table/dt=2016-10-10
/path/to/table/dt=2016-10-11
但是数据结构看起来像:
/path/to/table/2016-10-09
/path/to/table/2016-10-10
/path/to/table/2016-10-11
我不想改变现有的数据结构,所以我尝试像Hive那样做,我只是创建一个分区表,然后我可以自己添加这些分区,所以我不需要改变partition_key=partition_value 格式的现有数据结构。
但是下面的 SQL 不起作用:
CREATE TABLE my_table
USING com.databricks.spark.avro
PARTITIONED BY (dt)
OPTIONS (path "/path/to/table");
SQL命令行工具会抛出异常:Error in query: cannot recognize input near 'thrive_event_pt' 'USING' 'com' in table name; line 2 pos 0
Spark SQL 是否支持以这种方式创建分区表?还是我还缺少其他东西?
【问题讨论】:
【参考方案1】:Spark 可能还不支持此功能。我在使用 Spark 2.0 的 AVRO 文件和分桶表时遇到了同样的问题,首先转换为 ORC,然后它才起作用。所以尝试底层的 ORC 文件而不是 AVRO。例如,在“当前”中使用 ORC 文件并在“存档”中使用 AVRO 文件。
Bucketing 和 Partitioning 对于 Spark (SQL) 来说是相当新的东西。也许他们将来会支持此功能。即使是 Hive 之前的早期版本(低于 2.x)也不支持围绕桶和创建表的所有内容。另一方面,分区是 Hive 中一个更古老、更进化的东西。
【讨论】:
【参考方案2】:Spark 2.3 现在支持此功能。如果你使用的是 EMR,那么镜像 5.13 支持 spark 2.3
【讨论】:
以上是关于如何使用 Spark SQL 创建分区表的主要内容,如果未能解决你的问题,请参考以下文章
源码级解读如何解决Spark-sql读取hive分区表执行效率低问题