我知道我们可以通过
创建一个自动分区发现表CREATE TABLE my_table
USING com.databricks.spark.avro
OPTIONS (path "/path/to/table");
但是这需要将数据路径更改为partition_key=partition_value format
/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是否支持以这种方式创建分区表?还是我还遗漏了什么?
Spark 2.3现在支持此功能。如果您正在使用EMR,那么映像5.13支持spark 2.3
可能Spark还不支持。我在使用Spark 2.0的AVRO文件和桶状表时遇到了同样的问题,首先转换为ORC,然后它就工作了。所以尝试底层的ORC文件而不是AVRO文件。例如,在"当前"中使用ORC文件,在"存档"中使用AVRO文件。
bucket and Partitioning对于Spark (SQL)来说是相当新的东西。也许他们将来会支持这些功能。即使是Hive之前的早期版本(低于2.x)也不支持所有与桶存储和创建表相关的内容。另一方面,分区在Hive中是一个更老更进化的东西。
它似乎被支持。见https://spark.apache.org/docs/3.0.2/sql-ref-syntax-ddl-create-table-datasource.html
CREATE TABLE [ IF NOT EXISTS ] table_identifier
[ ( col_name1 col_type1 [ COMMENT col_comment1 ], ... ) ]
USING data_source
[ OPTIONS ( key1=val1, key2=val2, ... ) ]
[ PARTITIONED BY ( col_name1, col_name2, ... ) ] <---- here
[ CLUSTERED BY ( col_name3, col_name4, ... )
[ SORTED BY ( col_name [ ASC | DESC ], ... ) ]
INTO num_buckets BUCKETS ]
[ LOCATION path ]
[ COMMENT table_comment ]
[ TBLPROPERTIES ( key1=val1, key2=val2, ... ) ]
[ AS select_statement ]
现在可以使用PartitionBy。下面是一个例子:
spark.createDataFrame(
[{"age": 100, "name": "Hyukjin Kwon"}, {"age": 120, "name": "Ruifeng Zheng"}]
).write.partitionBy("name").mode("overwrite").format("parquet").save(d)