从 pyspark 脚本中删除 Hive 表时出现问题



我在hive中有一个表,使用hive-json-serde方法从许多json文件创建,WITH SERDEPROPERTIES('dots.in.keys'='true'),因为有些键有一个点,比如'aaa.bbb'。我创建外部表并为这些键使用反引号。现在我在使用 pyspark 脚本中删除此表时遇到问题sqlContext.sql("DROP TABLE IF EXISTS "+table_name),我收到以下错误消息:

An error occurred while calling o63.sql.
: org.apache.spark.SparkException: Cannot recognize hive type string: struct<associations:struct<aaa.bbb:array<string> ...
Caused by: org.apache.spark.sql.catalyst.parser.ParseException: 
mismatched input '.' expecting ':'(line 1, pos 33)
== SQL ==
struct<associations:struct<aaa.bbb:array<string>,...
---------------------------------^^^

在 HUE 中,我可以毫无问题地删除这张桌子。是我做错了,还是有更好的方法

看起来不可能

使用使用 hive-json-serde 方法创建的 Hive 表,键中的点,使用 pyspark 脚本中的 sqlContext.sql("..."),如我所愿。如果我想删除这样的 Hive 表或创建它(尚未尝试其他方法),总是存在相同的错误。所以我的解决方法是使用 python os.system() 并通过 hive 本身执行所需的查询:

q='hive -e "DROP TABLE IF EXISTS '+ table_name+';"'
os.system(q)

使用 CREATE TABLE 查询更复杂,因为我们需要用 '\' 转义反引号:

statement = "CREATE TABLE test111 (testA struct<`aa.bb`:string>) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' 
LOCATION 's3a://bucket/test111';"
q='hive -e "'+ statement+'"'

它会输出一些额外的蜂巢相关信息,但有效!

最新更新