HiveContext.sql(“插入”)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HiveContext.sql(“插入”)相关的知识,希望对你有一定的参考价值。

我正在尝试使用HiveContext插入数据,如下所示:

/* table filedata
CREATE TABLE `filedata`(
  `host_id` string,
  `reportbatch` string,
  `url` string,
  `datatype` string,
  `data` string,
  `created_at` string,
  `if_del` boolean)
*/
hiveContext.sql("insert into filedata (host_id, data) values ("a1e1", "welcome")")

错误并尝试使用“选择”:

hiveContext.sql("select "a1e1" as host_id, "welcome"as data").write.mode("append").saveAsTable("filedata")
/*
stack trace 
java.lang.ArrayIndexOutOfBoundsException: 2
*/

它需要像这样的所有列:

hc.sql("select "a1e1" as host_id,
          "xx" as reportbatch,
          "xx" as url,
          "xx" as datatype,
          "welcome" as data,
          "2017" as created_at, 
          1 as if_del").write.mode("append").saveAsTable("filedata")

有没有办法插入指定的列?例如,仅插入列“host_id”和“data”。

答案

据我所知,Hive不支持仅将值插入到某些列中

从文档中

VALUES子句中列出的每一行都插入到表tablename中。

必须为表中的每个列提供值。尚不支持允许用户仅将值插入某些列的标准SQL语法。为了模仿标准SQL,可以为用户不希望为其赋值的列提供空值。

所以你应该试试这个:

  val data = sqlc.sql("select 'a1e1', null, null, null, 'welcome', null, null, null")
  data.write.mode("append").insertInto("filedata")

参考here

另一答案

如果使用行列式文件格式(如ORC),则可以执行此操作。请参阅下面的工作示例。这个例子在Hive中,但与HiveContext一起工作得非常好。

hive> use default;
OK
Time taken: 1.735 seconds
hive> create table test_insert (a string, b string, c string, d int) stored as orc;
OK
Time taken: 0.132 seconds
hive> insert into test_insert (a,c) values('x','y');
Query ID = user_20171219190337_b293c372-5225-4084-94a1-dec1df9e930d
Total jobs = 1
Launching Job 1 out of 1


Status: Running (Executing on YARN cluster with App id application_1507021764560_1375895)

--------------------------------------------------------------------------------
        VERTICES      STATUS  TOTAL  COMPLETED  RUNNING  PENDING  FAILED  KILLED
--------------------------------------------------------------------------------
Map 1 ..........   SUCCEEDED      1          1        0        0       0       0
--------------------------------------------------------------------------------
VERTICES: 01/01  [==========================>>] 100%  ELAPSED TIME: 4.06 s
--------------------------------------------------------------------------------
Loading data to table default.test_insert
Table default.test_insert stats: [numFiles=1, numRows=1, totalSize=417, rawDataSize=254]
OK
Time taken: 6.828 seconds
hive> select * from test_insert;
OK
x       NULL    y       NULL
Time taken: 0.142 seconds, Fetched: 1 row(s)
hive>

以上是关于HiveContext.sql(“插入”)的主要内容,如果未能解决你的问题,请参考以下文章

使用SparkSQL HiveContext“INSERT INTO ...”

从 spark sql 插入配置单元表

Hivecontext.sql 返回空结果火花

Spark HiveContext 使用 sql 方法应用 IN 操作

在 Pyspark HiveContext 中,SQL OFFSET 的等价物是啥?

使用 spark hivecontext 读取外部 hive 分区表的问题