Python 和 Spark : Dataframe Write does not persist on filesystem

标签 python apache-spark io pyspark distributed-computing

我想将我的数据帧写入本地文件系统:

path = "/tmp/test"

df = spark.sql(select_str)
df.write.parquet(path, mode="overwrite", compression="snappy")

代码运行没有错误,但是当我查看tmp时,没有test并且如果我想将其读回pyarrow parquet:

parquet = pq.ParquetDataset(path)

我收到错误:

IOError: Passed non-file path: /tmp/test

hdfs://tmp/test 也会发生同样的情况

我在这里缺少什么?

编辑

我在使用它之前先尝试创建一个真实的文件。所以我创建了/tmp/parquet.parquet。现在可以读取该文件,但它始终为空。所以这样写根本行不通。

编辑2

Spark 配置:

spark = SparkSession.builder \
    .master("yarn") \
    .appName("my_app") \
    .config("spark.driver.bindAddress", "0.0.0.0") \
    .config("spark.driver.host", host) \
    .config("spark.driver.port", port) \
    .config("spark.driver.memory", "4G") \
    .config("spark.executor.memory", "8G") \
    .config("spark.blockManager.port", portBlockManager) \
    .enableHiveSupport() \
    .getOrCreate()

最佳答案

您在哪种模式下运行 Spark 应用程序?客户端/集群/独立机? 由于您尝试将文件保存在本地文件系统中,因此您需要了解驱动程序实际运行的位置(例如在哪台机器中)。

如果是集群模式,则文件很可能被写入集群上由资源管理器创建驱动程序的某个节点。最好的方法是将文件存储在 hdfs 中,默认情况下就是 df.write.parquet(path, mode="overwrite", compression="snappy")就可以了。

默认使用的文件系统是 hdfs,因此如果您只需提供 /tmp/test它正在 hdfs 中寻找该路径,而不是本地文件系统。

而且我猜你正在 pq.ParquetDataset 中使用 pyarrow 库默认情况下,它将在本地文件系统上查找路径。

确保在读/写期间使用正确的文件系统将解决该问题。

关于Python 和 Spark : Dataframe Write does not persist on filesystem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46298804/

相关文章:

apache-spark - Hadoop CLI 命令获取使用的总内存等,如 8088 上的 Hadoop Web UI 所示

c++ - 在 ifstream 中使用运算符 '>>' 的编译器错误

c - 有一种可移植的方法可以从类似套接字的文件描述符中丢弃许多可读字节吗?

scala - Spark 是否在读取时维护 Parquet 分区?

linux - 使用内核 AIO 的应用程序

python - 恢复使用 tf.estimator 训练的模型并通过 feed_dict 提供输入

python - 如何在条形图中连续显示累计计数(x轴没有空格)

python - 从 nd 点列表中获取 Numpy ndarray 值

Pythonic 对象实例化问题

scala - 如何在 Apache Spark 2.3.1 中映射/转换 ArrayType 中的每个元素