从pyspark脚本中删除配置单元表时出现问题

ztigrdn8  于 2021-06-27  发布在  Hive
关注(0)|答案(1)|浏览(421)

我在hive中有一个表,它是使用hivejson serde方法从许多json文件创建的,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>,...
---------------------------------^^^

总之,我可以毫无问题地放下这张table。是我做错了,还是有更好的方法?

tyu7yeag

tyu7yeag1#

看起来不可能像我所希望的那样,使用pyspark脚本中的sqlcontext.sql(“…”),使用hivejson-serde方法创建的配置单元表,键中有点。如果我想删除这样的配置单元表,或者创建它(还没有尝试其他方法),总是会出现相同的错误。因此,我的解决方法是使用python os.system()并通过配置单元本身执行所需的查询:

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

create table query更复杂,因为我们需要用“\”转义backticks:

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+'"'

它输出一些额外的Hive相关的信息,但工作!

相关问题