Spark Scala创建外部配置单元表不使用位置作为变量

Posted

技术标签:

【中文标题】Spark Scala创建外部配置单元表不使用位置作为变量【英文标题】:Spark Scala create external hive table not working with location as a variable 【发布时间】:2016-06-19 16:39:34 【问题描述】:

我正在尝试从 Spark 应用程序创建 Hive 外部表并将位置作为变量传递给 SQL 命令。它不会创建 Hive 表,我没有看到任何错误。

 val location = "/home/data"
 hiveContext.sql(s"""CREATE EXTERNAL TABLE IF NOT EXISTS TestTable(id STRING,name STRING) PARTITIONED BY (city string)  STORED AS PARQUET LOCATION '$location' """)

【问题讨论】:

您是否尝试过hdfs dfs -ls /home/data 以确保它没有被创建?这会返回什么? 【参考方案1】:

Spark 仅支持创建托管表。即使这样也有严格的限制:它不支持动态分区表。

TL;DR,您可以通过 Spark 创建外部表。 Spark 可以 读取它们

【讨论】:

它不能通过 Spark 应用程序工作。但可以在 Hive 中工作 @GG 更新了我的答案:记住这不起作用。【参考方案2】:

不确定哪个版本有此限制。 我使用 Spark 1.6、Hive 1.1。

我可以创建外部表,请按照以下说明操作:

var query = "CREATE EXTERNAL TABLE avro_hive_table ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'TBLPROPERTIES   ('avro.schema.url'='hdfs://localdomain/user/avro/schemas/activity.avsc')    STORED AS INPUTFORMAT    'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'    OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'    LOCATION    '/user/avro/applog_avro'"
var hiveContext = new org.apache.spark.sql.hive.HiveContext(sc);

hiveContext.sql(query);
var df = hiveContext.sql("select count(*) from avro_hive_table");

【讨论】:

以上是关于Spark Scala创建外部配置单元表不使用位置作为变量的主要内容,如果未能解决你的问题,请参考以下文章

无法指向使用来自 spark 的配置单元创建的外部表

在 spark 中创建带有模式的配置单元外部表

scala/spark 代码中不允许在配置单元中添加列

如何从代码外部提供spark / scala中的模式

来自 Apache Spark 的外部配置单元中存在的查询表 [重复]

Spark scala 模拟 spark.implicits 用于单元测试