我在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中,我可以毫无问题地删除此表。我做错了吗,还是有更好的方法?
答案 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+'"'
它会输出一些其他与配置单元相关的信息,但是可以使用!