PySpark/HIVE:附加到现有表

Posted

技术标签:

【中文标题】PySpark/HIVE:附加到现有表【英文标题】:PySpark/HIVE: append to an existing table 【发布时间】:2017-11-29 16:09:25 【问题描述】:

真正的基本问题 pyspark/hive 问题:

如何追加到现有表?我的尝试如下

from pyspark import SparkContext, SparkConf
from pyspark.sql import HiveContext
conf_init = SparkConf().setAppName('pyspark2')
sc = SparkContext(conf = conf_init)
hive_cxt = HiveContext(sc)

import pandas as pd
df = pd.DataFrame('a':[0,0], 'b':[0,0])
sdf = hive_cxt.createDataFrame(df)
sdf.write.mode('overwrite').saveAsTable('database.table') #this line works

df = pd.DataFrame('a':[1,1,1], 'b':[2,2,2])
sdf = hive_cxt.createDataFrame(df)
sdf.write.mode('append').saveAsTable('database.table') #this line does not work
#sdf.write.insertInto('database.table',overwrite = False) #this line does not work

谢谢! 山姆

【问题讨论】:

sdf.write.mode('append') 是附加到 Hive 表的正确方法。在 PySpark 2.2.0 中,上面的示例按预期工作。您收到任何错误消息吗? 嗯。我正在使用相同的版本。我收到一长串错误消息,但我认为这是主要的:IllegalArgumentException: 'Expected exactly one path to be specified, but got: ' 这听起来像是 Hive 配置问题。如果您将.option("path", "hdfs://....") 添加到写入中,它是否有效? 感谢您的帮助!愚蠢的问题,如何获得hdfs的路径? (我在展示我是多么的新手!我用谷歌搜索了它,但结果并不是很有帮助。) HDFS 路径,如果你配置好了,可以在 Spark 的 Master WebUI(8080 端口)中找到。您的错误消息表明路径为空。 【参考方案1】:

似乎使用 option('overwrite') 导致了问题;它删除表,然后重新创建一个新表。如果我执行以下操作,一切正常:

from pyspark import SparkContext, SparkConf
from pyspark.sql import HiveContext

conf_init = SparkConf().setAppName('pyspark2')
sc = SparkContext(conf = conf_init)
print(sc.version)
hive_cxt = HiveContext(sc)
hive_cxt.sql('USE database')

query = """
        CREATE TABLE IF NOT EXISTS table (a int, b int)
        STORED AS parquet
        """
hive_cxt.sql(query)

import pandas as pd
df = pd.DataFrame('a':[0,0], 'b':[0,0])
sdf = hive_cxt.createDataFrame(df)
sdf.write.mode('append').format('hive').saveAsTable('table')

query = """
        SELECT *
        FROM   table
        """
df = hive_cxt.sql(query)
df = df.toPandas()
print(df) # successfully pull the data in table

df = pd.DataFrame('a':[1,1,1], 'b':[2,2,2])
sdf = hive_cxt.createDataFrame(df)
sdf.write.mode('append').format('hive').saveAsTable('table')

【讨论】:

【参考方案2】:

我认为您之前忘记使用格式选项,当您尝试追加而不是像上面提到的那样覆盖时会导致问题。

【讨论】:

以上是关于PySpark/HIVE:附加到现有表的主要内容,如果未能解决你的问题,请参考以下文章

pyspark hive.table 没有读取配置单元表的所有行

Python:将列附加到 PrettyTable 中的现有表

PySpark/Hive:如何使用 LazySimpleSerDe 创建表以转换布尔值“t”/“f”?

我可以使用浏览器工具将数据附加到 Google Big 查询中的现有表吗?

附加到表功能不起作用

将数据透视结果附加(插入)到现有 SQL 表中