Тип данных Pandas datetime64 [ns] не работает в Hive / Athena - PullRequest
0 голосов
/ 25 декабря 2018

Я работаю над приложением Python, которое просто конвертирует CSV-файл в формат паркет, совместимый с hive / athena, и для этого использую библиотеки fastparquet и pandas.В csv-файле есть значения меток времени, такие как 2018-12-21 23:45:00, которые должны быть записаны как тип timestamp в файле паркета.Ниже мой код, который выполняется,

columnNames = ["contentid","processed_time","access_time"]

dtypes = {'contentid': 'str'}

dateCols = ['access_time', 'processed_time']

s3 = boto3.client('s3')

obj = s3.get_object(Bucket=bucketname, Key=keyname)

df = pd.read_csv(io.BytesIO(obj['Body'].read()), compression='gzip', header=0, sep=',', quotechar='"', names = columnNames, error_bad_lines=False, dtype=dtypes, parse_dates=dateCols)

s3filesys = s3fs.S3FileSystem()

myopen = s3filesys.open

write('outfile.snappy.parquet', df, compression='SNAPPY', open_with=myopen,file_scheme='hive',partition_on=PARTITION_KEYS)

, код успешно запущен, ниже - кадр данных, созданный pandas

contentid                 object
processed_time            datetime64[ns]
access_time               datetime64[ns]

И, наконец, когда я запросил файл паркета в Hive иафина, значение метки времени +50942-11-30 14:00:00.000 вместо 2018-12-21 23:45:00

Любая помощь высоко ценится

Ответы [ 2 ]

0 голосов
/ 25 мая 2019

Проблема, похоже, связана с Афиной, кажется, что она поддерживает только int96, и когда вы создаете временную метку в пандах, это int64

Мой столбец данных, содержащий строковую дату, называется "sdate". Сначала я конвертируюк отметке времени

# add a new column w/ timestamp
df["ndate"] = pandas.to_datetime["sdate"]
# convert the timestamp to microseconds
df["ndate"] = pandas.to_datetime(["ndate"], unit='us')

# Then I convert my dataframe to pyarrow
table = pyarrow.Table.from_pandas(df, preserve_index=False)

# After that when writing to parquet add the coerce_timestamps and 
# use_deprecated_int96_timstamps. (Also writing to S3 directly)
OUTBUCKET="my_s3_bucket"

pyarrow.parquet.write_to_dataset(table, root_path='s3://{0}/logs'.format(OUTBUCKET), partition_cols=['date'], filesystem=s3, coerce_timestamps='us', use_deprecated_int96_timestamps=True)

0 голосов
/ 07 мая 2019

Я столкнулся с той же проблемой, после долгих исследований, она решается сейчас.

когда вы делаете

write('outfile.snappy.parquet', df, compression='SNAPPY', open_with=myopen,file_scheme='hive',partition_on=PARTITION_KEYS)

, он использует fastparquet позади сцены, который использует другойкодировка для DateTime, чем то, с чем совместима Athena.

решение заключается в следующем: удалить fastparquet и установить pyarrow

  • pip удалить fastparquet
  • pip install pyarrow

снова запустите ваш код.Это должно сработать на этот раз.:)

...