在 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 时不是文件异常的主要内容,如果未能解决你的问题,请参考以下文章

运行 PySpark 命令时出错

如何在 Hadoop 上运行 pySpark

运行pyspark时出错

如何在 oozie 4.2.0 上运行火花动作(pyspark 脚本)?

在运行 AWS Glue ETL 作业并命名输出文件名时,有没有办法从 S3 存储桶中读取文件名。 pyspark 是不是提供了一种方法来做到这一点?

数据分析工具篇——pyspark应用详解