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

时间:2018-12-28 19:49:22

标签: json hive pyspark hiveql hive-serde

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

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中,我可以毫无问题地删除此表。我做错了吗,还是有更好的方法?

1 个答案:

答案 0 :(得分:0)

似乎我无法使用通过hive-json-serde方法创建的Hive表,并使用pyspark脚本中的sqlContext.sql(“ ...”)在键中使用点号。如果我想删除这样的Hive表或创建它,总是存在相同的错误(尚未尝试其他操作)。因此,我的解决方法是使用python os.system()并通过配置单元本身执行所需的查询:

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

它会输出一些其他与配置单元相关的信息,但是可以使用!