AWS glue 爬虫奇怪地解析 parquet 的 timetick
AWS glue crawler parses parquet's timetick weirdly
基础
我每天用 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
服务器日期时间设置为 utc
cron 进程
1. 从雅典娜下载
2.制作pandas数据框
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)
- 使用 glue-crawler
- 从 athena 获取数据并使用它(如 tableau)
问题
1.问题是日期时间列。
2. datetime列名是'reg_date',来自mariadb列,type是'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)
- 当我使用 s3 在 AWS 控制台 Web 浏览器上检查 s3 parquet 文件时,它没有显示任何问题。 (我点击 s3 -> bucket -> path -> file -> select source -> preview)
[
{
"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",
....
....
- 我认为reg_date栏是完全正常的。
- 但是当我 运行 粘合爬虫并使用 athena 预览时,它变得很奇怪。
#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
- 'reg_date' 列变得很奇怪!
- 胶水爬虫设置的都是基本的,只设置了iam、datacatalog名称、s3源等基本设置类别
接下来是事物的类型:
type(result_df['reg_date'][0])
#pandas._libs.tslibs.timestamps.Timestamp
type(result_df['scenario_reg_date'][0])
#str
我尝试了接下来的事情。
dataframe.to_parquet(引擎='pyarrow')
它将时间戳保存为 bigint 类型。所以胶水爬虫也能识别它的 bigint 类型。雅典娜查询也显示它是 bigint 类型。
dataframe['reg_date'] = dataframe['reg_date'].apply(lambda x : x.to_pydatetime().strftime("%Y-%m- %dT%H:%M:%S.%fZ")
在这种情况下,s3 控制台显示它正常,但 glue crawler 识别了它 'string' type... athena 也识别了它。
我认为 parquet 格式有一些保存其模式的秘密。
我希望...
Glue 爬虫将日期时间数据解析为正常时间标记。
不是 +51357-12-22 18:56:40.000,只是 2019-05-22 14:06:25.000 喜欢 scenario_reg_date 列。
我想知道为什么会出现这个问题。
钻了5个多小时,毁了我一整天。
如何解决这个问题?
Athena 需要 Java TIMESTAMP 格式:YYYY-MM-DD HH:MM:SS.fffffffff
。您需要调整您的值以匹配此格式。
Source here
请注意,Glue 爬虫经常无法检测时间戳列并将它们分类为字符串(就像您的 scenario_reg_date
)。因此,如果您希望稍后在这些列上使用日期功能,您将采用 table 的 DDL > 手动转换数据类型 > 删除并重新创建 table.
基础
我每天用 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
服务器日期时间设置为 utc
cron 进程
1. 从雅典娜下载
2.制作pandas数据框
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)
- 使用 glue-crawler
- 从 athena 获取数据并使用它(如 tableau)
问题
1.问题是日期时间列。
2. datetime列名是'reg_date',来自mariadb列,type是'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)
- 当我使用 s3 在 AWS 控制台 Web 浏览器上检查 s3 parquet 文件时,它没有显示任何问题。 (我点击 s3 -> bucket -> path -> file -> select source -> preview)
[
{
"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",
....
....
- 我认为reg_date栏是完全正常的。
- 但是当我 运行 粘合爬虫并使用 athena 预览时,它变得很奇怪。
#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
- 'reg_date' 列变得很奇怪!
- 胶水爬虫设置的都是基本的,只设置了iam、datacatalog名称、s3源等基本设置类别
接下来是事物的类型:
type(result_df['reg_date'][0])
#pandas._libs.tslibs.timestamps.Timestamp
type(result_df['scenario_reg_date'][0])
#str
我尝试了接下来的事情。
dataframe.to_parquet(引擎='pyarrow')
它将时间戳保存为 bigint 类型。所以胶水爬虫也能识别它的 bigint 类型。雅典娜查询也显示它是 bigint 类型。dataframe['reg_date'] = dataframe['reg_date'].apply(lambda x : x.to_pydatetime().strftime("%Y-%m- %dT%H:%M:%S.%fZ")
在这种情况下,s3 控制台显示它正常,但 glue crawler 识别了它 'string' type... athena 也识别了它。
我认为 parquet 格式有一些保存其模式的秘密。
我希望...
Glue 爬虫将日期时间数据解析为正常时间标记。
不是 +51357-12-22 18:56:40.000,只是 2019-05-22 14:06:25.000 喜欢 scenario_reg_date 列。
我想知道为什么会出现这个问题。
钻了5个多小时,毁了我一整天。
如何解决这个问题?
Athena 需要 Java TIMESTAMP 格式:YYYY-MM-DD HH:MM:SS.fffffffff
。您需要调整您的值以匹配此格式。
Source here
请注意,Glue 爬虫经常无法检测时间戳列并将它们分类为字符串(就像您的 scenario_reg_date
)。因此,如果您希望稍后在这些列上使用日期功能,您将采用 table 的 DDL > 手动转换数据类型 > 删除并重新创建 table.