Python & Spark:Dataframe Write 不会在文件系统上持续存在
Python & Spark: Dataframe Write does not persist on filesystem
我想将我的数据帧写入本地文件系统:
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()
尝试:
"file:///tmp/test"
而不是:
"/tmp/test"
您 运行 您的 spark 应用程序处于哪种模式? Client/Cluster/Standalone?
由于您试图将文件保存在本地文件系统中,因此您需要了解驱动程序实际运行的位置(如在哪台机器上)。
如果是集群模式,文件很可能被写入集群上的某个节点,资源管理器在该节点上创建了驱动程序。最好的方法是将文件存储在 hdfs 中,默认情况下 df.write.parquet(path, mode="overwrite", compression="snappy")
会这样做。
默认使用的文件系统是 hdfs,所以如果您简单地提供 /tmp/test
它会在 hdfs 而不是本地文件系统中寻找该路径。
此外,我猜您正在 pq.ParquetDataset
中使用 pyarrow 库,默认情况下它会在本地文件系统上查找路径。
确保在 read/write 期间使用正确的文件系统将解决此问题。
我想将我的数据帧写入本地文件系统:
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()
尝试:
"file:///tmp/test"
而不是:
"/tmp/test"
您 运行 您的 spark 应用程序处于哪种模式? Client/Cluster/Standalone? 由于您试图将文件保存在本地文件系统中,因此您需要了解驱动程序实际运行的位置(如在哪台机器上)。
如果是集群模式,文件很可能被写入集群上的某个节点,资源管理器在该节点上创建了驱动程序。最好的方法是将文件存储在 hdfs 中,默认情况下 df.write.parquet(path, mode="overwrite", compression="snappy")
会这样做。
默认使用的文件系统是 hdfs,所以如果您简单地提供 /tmp/test
它会在 hdfs 而不是本地文件系统中寻找该路径。
此外,我猜您正在 pq.ParquetDataset
中使用 pyarrow 库,默认情况下它会在本地文件系统上查找路径。
确保在 read/write 期间使用正确的文件系统将解决此问题。