【发布时间】:2020-07-31 12:45:16
【问题描述】:
这两个查询有什么区别:
SELECT my_fun(col_name) FROM my_table;
和
CREATE TABLE new_table AS SELECT my_fun(col_name) FROM my_table;
其中 my_fun 是一个 java UDF。
我在问,因为当我创建新表(第二个查询)时,我收到一个 java 错误。
Failure while running task:java.lang.RuntimeException: java.lang.RuntimeException: Map operator initialization failed
...
Caused by: org.apache.hadoop.hive.ql.exec.UDFArgumentException: Unable to instantiate UDF implementation class com.company_name.examples.ExampleUDF: java.lang.NullPointerException
我发现错误的来源是我的java文件中的一行:
encoded = Files.readAllBytes(Paths.get(configPath));
但问题是为什么它在未创建表时有效而在创建表时失败?
【问题讨论】:
-
你的表有多少行?如果它真的很小,第一个查询可能在本地执行,而第二个查询只在 Hadoop 集群上执行。还有,
configPath是本地路径还是HDFS路径? -
create-table-as-select(第二个示例)是 CTAS。它对可能导致问题的表有一些限制。你读过CTAS in the Hive DDL manual 的部分吗?它列出了两个限制: 1:目标表不能是外部表。 2:目标表不能是列表分桶表。这些都适用吗?
-
@serge_k 似乎与表大小无关,即大小表都失败。我在本地文件系统和 hdfs 上测试了 configPath,它也失败了。但这可能是一个好点,因为此路径被设置为环境变量。如果它是硬编码的,它可以工作。我必须检查一下。
-
@zac 不,在这种情况下不适用。