Spark SQL-插入外部Hive表错误

时间:2018-10-04 03:35:57

标签: apache-spark hive apache-spark-sql parquet

我正在尝试通过spark sql将数据插入到外部配置单元表中。 我的蜂巢表通过一列存储。 创建外部配置单元表的查询是这个

create external table tab1 ( col1 type,col2 type,col3 type) clustered by (col1,col2) sorted by (col1) into 8 buckets stored as parquet

现在,我尝试将实木复合地板文件(存储在hdfs中)中的数据存储到表中。 这是我的代码

    SparkSession session = SparkSession.builder().appName("ParquetReadWrite").
                    config("hive.exec.dynamic.partition", "true").
                    config("hive.exec.dynamic.partition.mode", "nonstrict").
                    config("hive.execution.engine","tez").
                    config("hive.exec.max.dynamic.partitions","400").
                    config("hive.exec.max.dynamic.partitions.pernode","400").
                    config("hive.enforce.bucketing","true").
                    config("optimize.sort.dynamic.partitionining","true").
                    config("hive.vectorized.execution.enabled","true").
                    config("hive.enforce.sorting","true").
                    enableHiveSupport()
                    .master(args[0]).getOrCreate();
String insertSql="insert into tab1 select * from"+"'"+parquetInput+"'";

session.sql(insertSql);
  1. 当我运行代码时,它抛出以下错误

    预期的输入“ hdfs:// url:port / user / clsadmin / somedata.parquet”不匹配(第1行,pos 50)

    == SQL == 插入UK_DISTRICT_MONTH_DATA中,从“ hdfs:// url:port / user / clsadmin / somedata.parquet”中选择* -------------------------------------------------- ^^^

    at org.apache.spark.sql.catalyst.parser.ParseException.withCommand(ParseDriver.scala:239)
    at org.apache.spark.sql.catalyst.parser.AbstractSqlParser.parse(ParseDriver.scala:115)
    at org.apache.spark.sql.execution.SparkSqlParser.parse(SparkSqlParser.scala:48)
    
  2. 将配置单元执行引擎用作Tez和Spark有什么区别?

2 个答案:

答案 0 :(得分:0)

您尝试过

LOAD DATA LOCAL INPATH'/ path / to / data'

覆盖表名称;

答案 1 :(得分:0)

在Hive中创建要指定的HDFS外部表。

create external table tab1 ( col1 type,col2 type,col3 type) 
clustered by (col1,col2) sorted by (col1) into 8 buckets 
stored as parquet 
LOCATION hdfs://url:port/user/clsadmin/tab1

hive不必填充数据,同一应用程序或其他应用程序都可以将数据提取到该位置,并且hive通过定义位置的架构顶部来访问数据。

* == SQL == 插入UK_DISTRICT_MONTH_DATA中,从“ hdfs:// url:port / user / clsadmin / somedata.parquet”中选择* -------------------------------------------------- ^^^ *

parquetInput是实木复合地板HDFS文件路径,而不是Hive表名称。因此是错误。

有两种方法可以解决此问题:

  1. 为“ parquetInput”定义外部表并提供该表 名称
  2. 使用LOAD DATA INPATH 'hdfs://url:port/user/clsadmin/somedata.parquet' INTO TABLE tab1