通过 Spark 将 csv 文件加载到现有的 HIVE 故事中

Posted

技术标签:

【中文标题】通过 Spark 将 csv 文件加载到现有的 HIVE 故事中【英文标题】:loading a csv file to existing HIVE tale through Spark 【发布时间】:2017-12-22 09:02:56 【问题描述】:

下面是我编写的连接到 RDBMS 的代码,然后创建临时表,在该临时表上执行 SQL 查询,通过 databricks 模块将 SQL 查询输出保存为 .csv 格式。

from pyspark import SparkContext
sc = SparkContext("local", "Simple App")
from pyspark.sql import SQLContext, Row
sqlContext = SQLContext(sc)
from pyspark.sql import HiveContext
sqlContext = HiveContext(sc)

df = sqlContext.read.format("jdbc").option("url","jdbc:sqlserver://<server>:<port>").option("databaseName","xxx").option("driver","com.microsoft.sqlserver.jdbc.SQLServerDriver").option("dbtable","xxxx").option("user","xxxxx").option("password","xxxxx").load()

df.registerTempTable("test")

df1= sqlContext.sql("select * from test where xxx= 6")
df1.write.format("com.databricks.spark.csv").save("/xxxx/xxx/ami_saidulu")

df1.write.option("path", "/xxxx/xxx/ami_saidulu").saveAsTable("HIVE_DB.HIVE_TBL",format= 'csv',mode= 'Append')

其中 HIVE.DB 是现有的 HIVE 数据库 HIVE.TBL 是一个现有的 HIVE 表

执行代码后,出现以下错误:

py4j.protocol.Py4JJavaError: An error occurred while calling o68.saveAsTable.
: java.lang.RuntimeException: Append mode is not supported by com.databricks.spark.csv.DefaultSource15

这是否意味着,databricks 模块不支持“saveAsTable”功能?

如果是,请指出我代码中的错误。 如果不是,那么解决方案/解决方法/行业标准是什么?

火花 1.6.1

【问题讨论】:

Hive 表是外部的还是托管的?你在两者之间写一个 csv 有什么原因,你不能只做 df.write.saveAsTable('HIVE_DB.HIVE_TBL',write_mode='Append') 吗? 它是一个托管表,是的,我明白了你的意思。现在根据您的建议进行更改后,当我执行代码时,出现以下错误“SLF4J:无法加载类“org.slf4j.impl.StaticLoggerBinder”。SLF4J:默认为无操作(NOP)记录器实现“ 这是错误还是警告?我认为代码应该仍然可以工作,只是不记录任何内容。 那是一个失败的错误,但我相信代码是正确的。我确实遇到了一个 *** 解决方案“***.com/questions/7421612/…”。它说我们需要安装 jars。我检查了,那些罐子不在那里。 Missing SLF4J bindings 只是一个警告...您是否尝试对 Hive 进行增量导入? 【参考方案1】:

我可以建议您另一种解决方案。

您可以使用插入功能在表格中插入。

sqlContext.sql("INSERT INTO/OVERWRITE TABLE HIVE_DB.HIVE_TBL select * from test where xxx= 6")

我希望这个解决方案对你有帮助,你可以直接写入表格,为什么要写入csv然后写入表格?

即使你想要文本分隔文件@table 路径。只需将表定义为具有所需分隔符的 TextFile 表。您的文件@table 路径将是插入后分隔的。

谢谢

【讨论】:

【参考方案2】:

假设您的表是托管的: 只需执行 df.write.saveAsTable('HIVE_DB.HIVE_TBL',write_mode='Append')‌,无需通过中间 csv-File。

这个错误意味着csv的d​​atabricks模块不支持追加模式。 github here 上有一个问题。所以解决方法是不要使用带有追加模式的csv。

【讨论】:

以上是关于通过 Spark 将 csv 文件加载到现有的 HIVE 故事中的主要内容,如果未能解决你的问题,请参考以下文章

如何将熊猫数据添加到现有的 csv 文件中?

使用 pandas 将不同位置的行附加到现有的 csv 文件

如何使用 fast-csv npm 将新行或新行的数据(新行)附加到现有的 csv 文件

在python中将行添加到现有的csv文件

如何将多维数组添加到现有的 Spark DataFrame

有没有一种有效的方法可以附加到现有的 csv 文件而不在 R 中重复?