使用 API 而不是 SQL 从 Spark 创建 Hive 表?

Posted

技术标签:

【中文标题】使用 API 而不是 SQL 从 Spark 创建 Hive 表?【英文标题】:Create Hive Table from Spark using API, rather than SQL? 【发布时间】:2017-08-13 15:26:53 【问题描述】:

我想创建一个带分区的配置单元表。

表的架构是:

val schema = StructType(StructField(name,StringType,true),StructField(age,IntegerType,true))

我可以使用 Spark-SQL 做到这一点:

val query = "CREATE TABLE some_new_table (name string, age integer) USING org.apache.spark.sql.parquet OPTIONS (path '<some_path>') PARTITIONED BY (age)"

spark.sql(query)

当我尝试使用 Spark API(使用 Scala)时,表格中充满了数据。我只想创建一个空表并定义分区。这就是我正在做的,我做错了什么:

val df = spark.createDataFrame(sc.emptyRDD[Row], schema)

val options = Map("path" -> "<some_path>", "partitionBy" -> "age")

df.sqlContext().createExternalTable("some_new_table", "org.apache.spark.sql.parquet", schema, options);

我正在使用 Spark-2.1.1。

【问题讨论】:

【参考方案1】:

如果您跳过分区。可以试试saveAsTable:

spark.createDataFrame(sc.emptyRDD[Row], schema)
  .write
  .format("parquet")
  //.partitionBy("age")
  .saveAsTable("some_new_table")

Spark 分区和 Hive 分区不兼容,所以如果你想从 Hive 访问你必须使用 SQL:https://issues.apache.org/jira/browse/SPARK-14927

【讨论】:

以上是关于使用 API 而不是 SQL 从 Spark 创建 Hive 表?的主要内容,如果未能解决你的问题,请参考以下文章

从Spark SQL与RDD api编写数据

Spark SQL - 使用 SQL 语句使用 JDBC 加载数据,而不是表名

如何从 spark sql 访问本地镶木地板文件?

《Spark Python API 官方文档中文版》 之 pyspark.sql

Spark 1.3.x 的 org.apache.spark.sql.cassandra 的 API 文档在哪里?

从文件列表而不是 Spark 中的 PATH 读取是不是有效?