AWS胶搜寻器奇怪地解析了镶木地板的时间刻度

时间:2019-07-07 16:35:06

标签: python amazon-web-services amazon-s3 amazon-athena aws-glue

基础
我每天都使用python下载日志(使用cronjob,使用ipython)。
下载服务器是CENTOS7,已通过dockerized的ubuntu

(base) root@:/# uname -a
Linux f5210d345285 3.10.0-957.21.2.el7.x86_64 #1 SMP Wed Jun 5 14:26:44 UTC 2019 x86_64 GNU/Linux

服务器DateTime设置为utc

计划流程
1.从雅典娜下载
2.制作熊猫数据框
3.从mysql服务器(本地)获取聚合数据
4.加入和聚合
5.制作最终数据框
6.上传到s3

final_df.to_parquet(temp_filename, compression=None, engine='fastparquet')
FH = open(temp_filename, 'rb')
data_bytes = FH.read()
FH.close()
os.remove(filename)
boto3.session.resource('s3').Object(bucketname, s3pathname).put(Body=data_bytes)
  1. 使用粘合爬网器
  2. 从雅典娜获取数据并使用它(如Tableau)

问题
1.问题是日期时间列。
2. datetime列名称为'reg_date',它来自mariadb列,类型为'datetime'
3.当我显示数据框并对其进行操作时,'reg_date'工作正常。
4.如果我运行下一个代码,它也可以正常工作。

final_df.to_parquet(temp_filename, compression=None, engine='fastparquet')
read_df = pd.read_parquet(temp_filename)
display(read_df)
  1. 当我在s3的AWS控制台Web浏览器上检查s3实木复合地板文件时,它没有显示任何问题。 (我点击s3->桶->路径->文件->选择来源->预览)
    [
    {
        "id": "1251616",
        "press": "8",
        "reg_date": "2019-05-22T14:06:25.000Z", #this line
        "scenario_id": 5072,
        "scheduletype": "1",
        "url": "some url string",
        "user_id": "some id string",
        "writer": "some writer name string",
        "deleted": "0",
        "display": "1",
        "keyword": "some keyword string",
        "modifier": "some modifier string",
        "scenario_reg_date": "2019-05-15 15:04:24",
        "sentence": "some long string..",
        "standby_transmission": "1",
        "subject": "some long string..",
        "scenario_user_id": "some user id string",
        "press_name": "some string",
        "press_url": "some url string",
        "press_host": "some url string",
        "gaid": "some string",
        "article_number": 233235,
        "article_uid": "some string",
        "ga:adsenseadsclicks": 0,
        "ga:adsenseadsviewed": 11,
        "ga:adsensectr": 0,
        "ga:adsenseecpm": 0,
        "ga:adsenserevenue": 0,
        "ga:adsenseviewableimpressionpercent": 0,
        "ga:contentgroup1": "some string",
        "ga:contentgroup2": "some string",
        "ga:date": 20190704,
        "ga:hostname": "some string",
        "ga:hour": 12,
        "ga:keyword": "some string",
        "ga:pagepath": "some string",
        "ga:pagetitle": "some string",
        "ga:pageviews": 1,
        "ga:sessions": 1,
        "ga:source": "some string",
        "host": "some string",
        "adsenseattached": 1,
        "eventtime": "2019-07-04T12:00:00.000Z"
    },
    {
        "id": "1251616",
        "press": "8",
        "reg_date": "2019-05-22T14:06:25.000Z",  #and .. this line also
        "scenario_id": 5072,
        "scheduletype": "1",
    ....
    ....
  1. 我认为reg_date列完全正常。
  2. 但是当我运行胶水爬行器并通过雅典娜预览时,它变得很奇怪。
#in athena
SELECT "id","reg_date","scenario_reg_date" FROM "catalog-name"."table_name" limit 10

结果是

idx|id     |reg_date                 |scenario_reg_date
1  |1251616|+51357-12-22 18:56:40.000|2019-05-15 15:04:24
2  |1361993|+51390-05-01 13:36:40.000|2019-05-15 15:04:24
3  |1461362|+51417-09-19 00:53:20.000|2019-05-15 15:04:24
4  |1461362|+51417-09-19 00:53:20.000|2019-05-15 15:04:24
5  |1461362|+51417-09-19 00:53:20.000|2019-05-15 15:04:24
  1. “ reg_date”列变得完全奇怪!
  2. 胶粘剂搜寻器设置为所有基本设置,仅设置了iam,datacatalog名称,s3源,它们是基本设置类别

事物的类型是下一个:

type(result_df['reg_date'][0])
#pandas._libs.tslibs.timestamps.Timestamp

type(result_df['scenario_reg_date'][0])
#str

我尝试了接下来的事情。

  1. dataframe.to_parquet(engine ='pyarrow')
    它将时间戳保存为bigint类型。因此,胶搜寻器也可以识别为bigint类型。雅典娜查询也显示它为bigint类型。

  2. dataframe ['reg_date'] = dataframe ['reg_date']。apply(lambda x:x.to_pydatetime()。strftime(“%Y-%m-%dT%H:%M:%S 。%fZ“)
    在这种情况下,s3控制台将其显示为正常,但粘合搜寻器将其识别为“字符串”类型……还有雅典娜。

我认为实木复合地板格式可以保存其架构。

我希望...

Glue搜寻器将日期时间数据解析为正常的时间刻度。
不是 + 51357-12-22 18:56:40.000 ,只是 2019-05-22 14:06:25.000 ,例如 scenario_reg_date 列。

我想知道为什么会出现此问题。

我钻了5个多小时,这整天毁了我。

如何解决此问题?

1 个答案:

答案 0 :(得分:0)

雅典娜需要Java TIMESTAMP格式:YYYY-MM-DD HH:MM:SS.fffffffff。您需要调整您的值以匹配此格式。 Source here

请注意,Glue搜寻器通常无法检测到时间戳列并将其分类为字符串(例如您的scenario_reg_date)。因此,如果您希望稍后在这些列上使用日期功能,则可以使用表的DDL>手动转换数据类型>拖放并重新创建表。