【问题标题】:Pyspark: how to read a csv file with timestamp?Pyspark:如何读取带有时间戳的 csv 文件?
【发布时间】:2020-03-23 06:32:56
【问题描述】:

我有一个 .csv 表,如下所示

将熊猫导入为 pd df = pd.read_csv('myFile.csv') df.head(3)

            identifier                 identifier_type         timestamp           device_lat   device_lon
0   68d62a1b-b928-4225-b445-9607415905b3    gaid         2020-03-19 03:03:00 UTC    44.808169   -73.522956
1   1675a629-a010-44b6-98a9-72d04793821f    gaid         2020-03-18 21:15:42 UTC    42.103894   -76.799164
2   0fe7a0b7-028e-459e-b5d8-b59d31800b8e    gaid         2020-03-18 23:39:54 UTC    43.182028   -77.672017

我正在用pyspark阅读它

schema= StructType([
        StructField("identifier", StringType(), True),
        StructField("identifier_type", StringType(), True),
        StructField("timestamp", DateType(), True),
        StructField("device_lat", FloatType(), True),
        StructField("device_lon", FloatType(), True)])

myTable = spark.read.format("csv").schema(schema).load('NY_data/f0.csv') 
myTable = myTable[myTable['device_lat']>0]
myTable.show(3)

    +--------------------+---------------+----------+----------+----------+
|          identifier|identifier_type| timestamp|device_lat|device_lon|
+--------------------+---------------+----------+----------+----------+
|68d62a1b-b928-422...|           gaid|2020-03-19|  44.80817| -73.52296|
|1675a629-a010-44b...|           gaid|2020-03-18| 42.103893|-76.799164|
|0fe7a0b7-028e-459...|           gaid|2020-03-18|  43.18203| -77.67202|
+--------------------+---------------+----------+----------+----------+

为什么分、时、秒的信息消失了?

如果我尝试输入TimestampType 而不是DateType

schema= StructType([
        StructField("identifier", StringType(), True),
        StructField("identifier_type", StringType(), True),
        StructField("timestamp", TimestampType(), True),
        StructField("device_lat", FloatType(), True),
        StructField("device_lon", FloatType(), True)])

myTable = spark.read.format("csv").schema(schema).load('NY_data/f0.csv') 
myTable = myTable[myTable['device_lat']>0]
sqlContext.registerDataFrameAsTable(myTable, "myTable")

这就是我得到的

myTable.show(3)
+----------+---------------+---------+----------+----------+
|identifier|identifier_type|timestamp|device_lat|device_lon|
+----------+---------------+---------+----------+----------+
+----------+---------------+---------+----------+----------+

变量的类型是。

df.dtypes
identifier          object
identifier_type     object
timestamp           object
device_lat         float64
device_lon         float64
dtype: object

【问题讨论】:

  • @AlexW 我试过了,但我得到了空值,正如您在修改后的问题中看到的那样
  • df.dtypes 长什么样子?
  • @AlexW 我添加了信息
  • 你可以试试df['timestamp'] = pd.to_datetime(df['timestamp'].copy(), infer_datetime_format=True) 看看它是否会产生更好的结果?
  • @AlexW 现在它给出了timestamp datetime64[ns, UTC] 但我想直接在 pyspark 中阅读它。

标签: python pandas pyspark


【解决方案1】:

纯属猜测,但我认为您可能需要 TimestampType 类型而不是 DateType

DateTypedocumentation 仅提及月/日/年:

日期类型,支持“0001-01-01”到“9999-12-31”。请用 单例 DataTypes.DateType。

在内部,这表示为从纪元开始的天数 (1970-01-01 00:00:00 UTC)。

根据Pyspark docs,使用spark.read()时可以指定时间戳格式:

timestampFormat – 设置表示时间戳格式的字符串。 自定义日期格式遵循java.text.SimpleDateFormat 的格式。 这适用于时间戳类型。如果设置了 None ,则使用默认值 值,yyyy-MM-dd'T'HH:mm:ss.SSSXXX。默认值看起来像是 ISO 标准,因此如果您的 CSV 文件具有不同的时间戳格式,则如果不明确设置正确的格式值,它将无法工作。

https://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.DataFrameReader

因此,如果您的时间戳 CSV 值不同于默认的 ISO 8601 标准格式(例如 2020-03-22T21:51:29Z),则您需要将 CSV 日期/时间格式与相应的 java.text.SimpleDate 格式相匹配。 Java 文档中列出了日期/时间格式字符:

对于 CSV 值,例如 2020-01-19 19:30:30 UTC,日期格式字符串类似于:yyyy-mm-dd hh:mm:ss z

https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

【讨论】:

    猜你喜欢
    • 2016-02-11
    • 1970-01-01
    • 2013-04-19
    • 2020-09-22
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    相关资源
    最近更新 更多