Pyspark: как прочитать CSV-файл с отметкой времени? - PullRequest
0 голосов
/ 23 марта 2020

У меня есть таблица .csv, такая как: * Я читаю это с 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

1 Ответ

2 голосов
/ 23 марта 2020

Чисто догадываясь, но я думаю, что вам может понадобиться тип TimestampType вместо DateType.

Документация для DateType упоминает только месяц / День / Год:

Тип даты, поддерживающий "0001-01-01" - "9999-12-31". Пожалуйста, используйте одноэлементный DataTypes.DateType.

Внутренне это число определяется как количество дней с начала эпохи (1970-01-01 00:00:00 UT C).

Согласно Документам Pyspark , при использовании 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...