我试图在Hive中运行UDF,它基本上应该使用表中的值作为另一个参数来扫描外部csv文件。 查询我使用:Hive无法从EMR上的分布式缓存中找到文件
add jar s3://bucket_name/udf/hiveudf.jar;
add FILE hdfs:///myfile/myfile.csv;
CREATE TEMPORARY FUNCTION MyFunc AS '....udf.myUDF';
SELECT mydate, record_id, value, MyFunc('myfile.csv',value) from my_table;
结果是不稳定的,在某些情况下完全相同的查询工作得很好,但在案件的80%左右,它返回例外:
java.io.FileNotFoundException: myfile.csv (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:146)
at java.io.FileInputStream.<init>(FileInputStream.java:101)
at java.io.FileReader.<init>(FileReader.java:58)
...
文件似乎被添加到分布式缓存:
hive> list files;
/mnt/tmp/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx_resources/myfile.csv
我试着用variou EMR版本以及各种实例类型,并且找不到模式或触发此问题的原因。任何建议将不胜感激。
我在EMR上也面临同样的问题。你能解决它吗?我尝试了两种方式 - MyUDF(“./ MyFile.txt”)和MyUDF(“MyFile.txt”)。我添加了一些日志来从UDF打印文件路径,它试图在“/ user/home”目录中查找文件。 – Ajeet
好吧,那种。我通过复制并将Hive脚本粘贴到终端窗口来运行我的作业。我的工作是 - 从另一个终端窗口运行同样的工作,然后它神奇地工作,仍然不清楚为什么它可能很重要... – Coppernick