我有一些带有时间戳的spark(scala)数据帧/表,这些数据帧/表来自我们的DHW,并且有时使用一些高水印。
我想在python中使用pandas处理此数据,因此我将它们作为来自spark的镶木地板文件写入,并再次使用pandas读取。
问题是熊猫/小鸟无法处理时间戳。它们被转换为dateTime64[ns]
,女巫的日期范围有限。因此某些时间戳记(尤其是所有高水位标记)输入错误。
例如,如何强制熊猫将时间戳解释为dateTime[mu]
。还是将高(低)水印设置为NAN而不是仅使用错误的转换值?
这是最小的代码示例:
火花:
import org.apache.spark.sql.functions._
import org.apache.spark.sql.types._
val df_spark = Seq(
(1, "1050-01-01 23:00:01"),
(2, "2014-11-30 12:40:32"),
(3, "2016-12-29 09:54:00"),
(4, "2500-01-01 00:00:00")).toDF("id", "date-string")
.withColumn("valid_to", to_timestamp(col("date-string")))
df_spark.repartition(1).write.parquet("timestamptest")
df_spark.show
+---+-------------------+-------------------+
| id| date-string| valid_to|
+---+-------------------+-------------------+
| 1|1050-01-01 23:00:01|1050-01-01 23:00:01|
| 2|2014-11-30 12:40:32|2014-11-30 12:40:32|
| 3|2016-12-29 09:54:00|2016-12-29 09:54:00|
| 4|2500-01-01 00:00:00|2500-01-01 00:00:00|
+---+-------------------+-------------------+
在Python中读取 时:
import pandas as pd
df_pandas= pd.read_parquet("timestamptest")
df_pandas.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 id 4 non-null int32
1 date-string 4 non-null object
2 valid_to 4 non-null datetime64[ns]
dtypes: datetime64[ns](1), int32(1), object(1)
memory usage: 208.0+ bytes
df_pandas
id date-string valid_to
0 1 1050-01-01 23:00:01 2219-02-16 22:09:08.419103232
1 2 2014-11-30 12:40:32 2014-11-30 12:40:32.000000000
2 3 2016-12-29 09:54:00 2016-12-29 09:54:00.000000000
3 4 2500-01-01 00:00:00 1915-06-14 00:25:26.290448384
您现在看到第一个和最后一个时间戳是错误的。 如果我再次用火花阅读parqeut,一切都很好。