HiveContext.sql("插入")
Posted
技术标签:
【中文标题】HiveContext.sql("插入")【英文标题】:HiveContext.sql("insert into") 【发布时间】:2017-12-19 08:18:32 【问题描述】:我正在尝试使用 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”。
【问题讨论】:
【参考方案1】:据我所知,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
【讨论】:
来自文档:从 Hive 1.2.0 开始,每个 INSERT INTO T 都可以采用类似于 INSERT INTO T (z, x, c1) 的列列表。有关示例,请参阅 HIVE-9481 的描述。 "insert into filedata (host_id, data) values (\"a1e1\", \"welcome\")" 适用于 Hive,但不适用于 HiveContext。 查询中不支持的语言功能:插入表文件数据值(“a1e1”,null,null,null,“welcome”,null,null) 你是对的,你应该用 saveAsTable 方法来做,我会更新我的答案。我刚刚测试了它,它可以正常工作【参考方案2】:如果您使用的是行列文件格式(例如 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>
【讨论】:
@hyjal - 你的 spark 版本是什么?你能发布你的完整代码吗? Spark 版本:spark1.6 和完整代码包含在问题中。谢谢以上是关于HiveContext.sql("插入")的主要内容,如果未能解决你的问题,请参考以下文章
使用SparkSQL HiveContext“INSERT INTO ...”