从 spark sql 插入配置单元表
Posted
技术标签:
【中文标题】从 spark sql 插入配置单元表【英文标题】:Insert into hive table from spark sql 【发布时间】:2016-12-17 19:39:35 【问题描述】:我正在从 json 文件中读取一些数据并将其转换为我用来将数据发送到 hive 的字符串。
数据在 Hive 中正常到达,但它被分配到错误的列,我做了一个小例子
在 Hive 中:
Table name = TestTable, Column1 = test1, Column2 = test2`
我的代码:
data = hiveContext.sql("select \"hej\" as test1, \"med\" as test2")
data.write.mode("append").saveAsTable("TestTable")
data = hiveContext.sql("select \"hej\" as test2, \"med\" as test1")
data.write.mode("append").saveAsTable("TestTable")
这导致"hej"
两次出现在test1
中,"med"
两次出现在test2
中,而不是每次出现一个。
它似乎总是按书写顺序显示,而不是进入我用'as'
关键字提到的列。
有人有什么想法吗?
【问题讨论】:
【参考方案1】:它似乎总是按照书写的顺序出现......
你是对的。 Spark 的工作方式与任何 SQL 数据库一样。输入数据集中的列名没有任何区别。 而且由于您没有明确地将输出列映射到输入列,Spark 必须假设映射是按位置完成的。
只需仔细考虑以下测试用例...
hiveContext.sql("create temporary table TestTable (RunId string, Test1 string, Test2 string)")
hiveContext.sql("insert into table TestTable select 'A', 'x1', 'y1'")
hiveContext.sql("insert into table TestTable (RunId, Test1, Test2) select 'B', 'x2' as Blurb, 'y2' as Test1")
hiveContext.sql("insert into table TestTable (RunId, Test2, Test1) select 'C', 'x3' as Blurb, 'y3' as Test1")
data = hiveContext.sql("select 'xxx' as Test1, 'yyy' as Test2"))
data.registerTempTable("Dummy")
hiveContext.sql("insert into table TestTable(Test1, RunId, Test2) select Test1, 'D', Test2 from Dummy")
hiveContext.sql("insert into table TestTable select Test1, 'E', Test2 from Dummy")
hiveContext.sql("select * from TestTable").show(20)
免责声明 - 我实际上并没有测试这些命令,里面可能存在一些拼写错误和语法问题(特别是因为您没有提及您的 Hive 和 Spark 版本),但您应该明白这一点。
【讨论】:
您好,感谢您的回答。我不确定我是否完全理解为什么“而且由于您没有明确地将输出列映射到输入列,Spark 必须假设映射是按位置完成的。”我将如何明确地进行该映射?我以为这就是我说“作为 test2”所做的 Spark DataFrame 有一个特定的“源”模式。 Hive 表具有特定的“目标”模式。当使用带有 INSERT...SELECT 的常规 SQL 时,架构协调要么是显式的(按顺序列出目标列,与按顺序排列的源列),要么是隐式的(按目标的 c/o 位置)和源列)。使用 Spark API 时,Spark 必须以完全相同的方式工作,否则会破坏兼容性。但是你不能做显式映射,所以你搞砸了。底线,使用 SQL... @SamsonScharfrichter,您能否也使用更新和删除命令更新您的答案?以上是关于从 spark sql 插入配置单元表的主要内容,如果未能解决你的问题,请参考以下文章
Spark 2.3.0 SQL 无法将数据插入 hive hbase 表