Python& Spark:Dataframe Write不会在文件系统上保留

时间:2017-09-19 11:04:46

标签: 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 = pq.ParquetDataset(path)

我收到错误:

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

hdfs://tmp/test

会发生同样的情况

我在这里缺少什么?

修改

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

编辑2

Spark Config:

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()

2 个答案:

答案 0 :(得分:1)

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

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

默认情况下,使用的文件系统将是hd​​fs,因此如果您只是提供/tmp/test,它将在hdfs而不是本地文件系统中查找该路径。

此外我猜您在pq.ParquetDataset中使用的是pyarrow库,默认情况下会在本地文件系统上查找路径。

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

答案 1 :(得分:0)

尝试:

"file:///tmp/test"

而不是:

"/tmp/test"