pyspark:读取分区镶木地板 "my_file.parquet/col1=NOW" 字符串值替换为 <current_time> on read()
pyspark: read partitioned parquet "my_file.parquet/col1=NOW" string value replaced by <current_time> on read()
在 wsl Debian 10 上使用 pyspark 3.1.1
当读取使用包含字符串 NOW
的列分区的镶木地板文件时,该字符串将在执行 read()
函数时替换为当前时间。我想 NOW
字符串被解释为 now()
# step to reproduce
df = spark.createDataFrame(data=[("NOW",1), ("TEST", 2)], schema = ["col1", "id"])
df.write.partitionBy("col1").parquet("test/test.parquet")
>>> /home/test/test.parquet/col1=NOW
df_loaded = spark.read.option(
"basePath",
"test/test.parquet",
).parquet("test/test.parquet/col1=*")
df_loaded.show(truncate=False)
>>>
+---+--------------------------+
|id |col1 |
+---+--------------------------+
|2 |TEST |
|1 |2021-04-18 14:36:46.532273|
+---+--------------------------+
这是 pyspark 的错误还是正常功能?
如果是后者,是否有 sparkContext
选项来避免这种行为?
我怀疑这是一个预期的功能...但我不确定它记录在何处。无论如何,如果您想将该列保留为字符串列,您可以在读取 parquet 文件时提供一个模式:
df = spark.read.schema("id long, col1 string").parquet("test/test.parquet")
df.show()
+---+----+
| id|col1|
+---+----+
| 1| NOW|
| 2|TEST|
+---+----+
在 wsl Debian 10 上使用 pyspark 3.1.1
当读取使用包含字符串 NOW
的列分区的镶木地板文件时,该字符串将在执行 read()
函数时替换为当前时间。我想 NOW
字符串被解释为 now()
# step to reproduce
df = spark.createDataFrame(data=[("NOW",1), ("TEST", 2)], schema = ["col1", "id"])
df.write.partitionBy("col1").parquet("test/test.parquet")
>>> /home/test/test.parquet/col1=NOW
df_loaded = spark.read.option(
"basePath",
"test/test.parquet",
).parquet("test/test.parquet/col1=*")
df_loaded.show(truncate=False)
>>>
+---+--------------------------+
|id |col1 |
+---+--------------------------+
|2 |TEST |
|1 |2021-04-18 14:36:46.532273|
+---+--------------------------+
这是 pyspark 的错误还是正常功能?
如果是后者,是否有 sparkContext
选项来避免这种行为?
我怀疑这是一个预期的功能...但我不确定它记录在何处。无论如何,如果您想将该列保留为字符串列,您可以在读取 parquet 文件时提供一个模式:
df = spark.read.schema("id long, col1 string").parquet("test/test.parquet")
df.show()
+---+----+
| id|col1|
+---+----+
| 1| NOW|
| 2|TEST|
+---+----+