6

我有一个 CSV 数据,每个字段都用双引号括起来。当我创建 Hive 表使用 serde 'com.bizo.hive.serde.csv.CSVSerde' 在 Impala 中查询上表时,我收到错误 SerDe not found。

我在 /usr/lib/impala/lib 文件夹中添加了 CSV Serde JAR 文件。

后来在 Impala 文档中研究了 Impala 不支持自定义 SERDE。在这种情况下,我该如何克服这个问题,以便我的带引号的 CSV 数据得到处理。我想使用 CSV Serde,因为它在值中使用逗号,这是一个合法的字段值。

非常感谢

4

3 回答 3

5

你能用蜂巢吗?如果是这样,这是一种可能有效的方法。CREATE您的表作为EXTERNAL TABLEHive 中的表,并SERDE在 CREATE 语句的正确位置使用您的表(我认为您在 CREATE TABLE 语句的末尾需要类似 ROW FORMAT SERDE your_serde_here 之类的东西)。在此之前,您可能需要执行以下操作:

ADD JAR 'hdfs:///path/to/your_serde.jar' 

请注意,jar 应该在 hdfs 中的某个地方,并且需要它的三倍 /// 才能工作......

然后,仍然在 Hive 中,将该表复制到另一个表中,该表以 Impala 可以轻松使用的格式存储,例如 PARQUET。类似以下的内容会执行此复制:

CREATE TABLE copy_of_table 
   STORED AS PARQUET AS
   SELECT * FROM your_original_table

现在在 Impala 中使用INVALIDATE METADATA将元数据标记为陈旧:

INVALIDATE METADATA copy_of_table

你现在应该已经准备好在 Impala 中愉快地使用 copy_of_table 了。

让我知道这是否有效,因为在不久的将来我可能会这样做。

于 2014-12-16T18:52:19.570 回答
1

蜂巢内

CREATE TABLE mydb.my_serde_table_impala AS SELECT FROM mydb.my_serde_table

黑斑羚内

INVALIDATE METADATA mydb.my_serde_table_impala

添加这些步骤以包括首先删除 _impala 表以及为 serde 表填充或摄取文件的任何内容。

与 Hive 不同,Impala 绕过 MapReduce。因此,Impala 不能/不会像 MapReduce 那样使用 SerDe。

于 2017-03-29T21:13:41.400 回答
0

现在默认的 SerDe 类是org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDeImpala 支持的。不幸的是,它的功能少得多,例如,它不支持转义字符。

于 2020-01-15T09:55:17.293 回答