在 Hadoop 中运行 pyspark 时不是文件异常
Posted
技术标签:
【中文标题】在 Hadoop 中运行 pyspark 时不是文件异常【英文标题】:Not a File Exception when running pyspark in Hadoop 【发布时间】:2016-08-10 17:46:07 【问题描述】:我从 2 个差异源中将两个数据集舀到 Hive 中。我在 hive 中创建了两个表的并集,使用
create table db.table as select table 1 union select table 2
我使用 HiveContext 在 pyspark 中的这个表来执行一些分析功能,比如对列进行字符串索引。
hc=HiveContext(sc)
data = hc.sql("select * from db.table")
from pyspark.sql import SQLContext, Row, HiveContext
from pyspark.ml.feature import StringIndexer
indexer = StringIndexer(inputCol="col_cat", outputCol="cat_indexed")
indexed=indexer.fit(data).transform(data)
但是我得到以下错误
py4j.protocol.Py4JJavaError: An error occurred while calling o63.fit.
: java.io.IOException: Not a file:
所以我进入了 HDFS
hadoop fs -ls /hive/db/table
我找到了这张桌子,我不知道这里有什么问题。 我觉得是因为我没有创建外部表。但它上次没有外部工作。
【问题讨论】:
data.first()
能给你什么吗?
不,它给了我同样的错误
你试过在 spark 中 load the table 吗?
另外,你有没有配置 spark 使用hive-site.xml
?
我没有尝试从spark加载表格,我直接在hive中创建了一个联合并通过spark中的HiveContext访问它,但现在我认为表格根本没有加载,因为data.show()是也报错。
【参考方案1】:
好的,所以我找到了解决方法,我从目录中移动了文件 即来自
/hive/db/table/file
到
/hive/db/file
通过做
Hadoop fs -mv /hive/db/table/file /hive/db/file
现在它可以工作了,问题是 Hive 中的联合在表之间创建了一个分区,因此创建了额外的目录来保存文件。因此,当 Spark 尝试访问它们时,它指向的目录。所以我将文件位置更改为 spark 指向的位置。
【讨论】:
以上是关于在 Hadoop 中运行 pyspark 时不是文件异常的主要内容,如果未能解决你的问题,请参考以下文章
如何在 oozie 4.2.0 上运行火花动作(pyspark 脚本)?
在运行 AWS Glue ETL 作业并命名输出文件名时,有没有办法从 S3 存储桶中读取文件名。 pyspark 是不是提供了一种方法来做到这一点?