不支持SparkSQL表创建CLUSTER BY

时间:2017-01-30 17:31:04

标签: hive apache-spark-sql hiveql

根据Spark doc https://spark.apache.org/docs/2.1.0/sql-programming-guide.html#supported-hive-features,支持hive语句CLUSTER BY。但是当我尝试使用beeline的以下查询创建表时

CREATE TABLE set_bucketing_test (key INT, value STRING) CLUSTERED BY (key) INTO 10 BUCKETS;

我收到以下错误

Error: org.apache.spark.sql.catalyst.parser.ParseException:
Operation not allowed: CREATE TABLE ... CLUSTERED BY(line 1, pos 0)

不确定我在做什么错。有什么帮助吗?

1 个答案:

答案 0 :(得分:0)

你可以利用spark-sql中的cluster by feature来创建表,表连接等,这可以作为hive避免数据交换并在spark2.1 +

中排序

请参阅https://issues.apache.org/jira/browse/SPARK-15453

目前,hive无法识别此功能,因为元数据在spark和hive之间不兼容,这就是为什么即使在hive端识别此表也无法使用相同的语法,这将是将所有列视为Timer timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { ... } }, 0, 1000);

以下示例可能会给您一些想法:

准备来源

array

从源

创建两个存储桶表

你会看到"它与Hive不兼容。"通过向右滚动

val df = (0 until 80000).map(i => (i, i.toString, i.toString)).toDF("item_id", "country", "state").coalesce(1)

加入他们并解释

首先禁用广播加入,因为音量很小。

df.write.bucketBy(100, "country", "state").sortBy("country", "state").saveAsTable("kofeng.lstg_bucket_test")

17/03/13 15:12:01 WARN HiveExternalCatalog: Persisting bucketed data source table `kofeng`.`lstg_bucket_test` into Hive metastore in Spark SQL specific format, which is NOT compatible with Hive.

df.write.bucketBy(100, "country", "state").sortBy("country", "state").saveAsTable("kofeng.lstg_bucket_test2")

计划避免在SPARK 2.1.0中进行交换和排序,避免在SPARK2.0中进行交换,只过滤和扫描证明数据的位置利用率。

import org.apache.spark.sql.SparkSession
val spark = SparkSession.builder().appName("Spark SQL basic example").config("spark.sql.autoBroadcastJoinThreshold", "0").getOrCreate()