0

我在配置单元中有一个使用 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 中,我可以毫无问题地删除此表。我做错了吗,或者可能有更好的方法吗?

4

1 回答 1

0

看起来不可能像我想要的那样使用 pyspark 脚本中的 sqlContext.sql("...") 使用 hive-json-serde 方法创建的 Hive 表,键中带有点。如果我想删除这样的 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+'"'

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

于 2019-01-02T23:57:16.403 回答