我想将Hadoop Yarn作业历史文件解析为csv/sql格式,以便轻松查询。
我从.jhist文件中提取了AVRO模式,使用AVRO工具*.jar将AVRO数据文件转换为json流,使用jq将流组合为一个json,现在我需要从某些单独的json 中提取某些字段
[
{
"type": "AM_STARTED",
"event": {
"AMStarted": {
"startTime": 1636039435822,
"nodeManagerPort": 8041
}
}
},
{
"type": "TASK_STARTED",
"event": {
"TaskStarted": {
"taskid": "task_1351",
"jobStatus": "Started"
}
}
},
{
"type": "JOB_INITED",
"event": {
"JobInited": {
"launchTime": 1636039438569,
"totalMaps": 356,
"totalReduces": 100
}
}
},
{
"type": "JOB_FINISHED",
"event": {
"JobFinished": {
"jobid": "job_1636039105678_0061",
"finishTime": 1636043211181,
"totalCounters": {
"name": "TOTAL_COUNTERS",
"groups": [
{
"name": "org.apache.hadoop.mapreduce.FileSystemCounter",
"displayName": "File System Counters",
"counts": [
{
"name": "FILE_BYTES_READ",
"displayName": "FILE: Number of bytes read",
"value": 1156766568459
},
{
"name": "FILE_BYTES_WRITTEN",
"displayName": "FILE: Number of bytes written",
"value": 1720873364662
},
{
"name": "RANDOM_BYTES",
"displayName": "RANDOM: Bytes",
"value": 1720873311162
}
]
}
]
}
}
}
}
]
从类型AM_STARTED"json/index/row",我想要event.AMStarted.startTime
忽略TASK_STARTED-我不想要类型中有"TASK"的任何内容
从JOB_INITED,我想要所有字段
自JOB_FINISHED,我想要finishTime和FILE_BYTES_READ&FILE_BYTES_writted
我希望所有这些都以逗号分隔(可能还有"引号"(,这样我就可以将它们加载到csv中,然后加载到sql表中。
预期输出:
163603943582211636039438569356、100、1636043211181、1156766568459、1720873364662
这有什么语法?
我将使用以下内容:
jq -r 'map(.event | (.AMStarted.startTime // .JobQueueChange.jobQueueName // .JobInited[])) | @csv'
map
将映射应用于输入数组的每个元素;我们访问他们的事件,然后尝试访问.AMStarted.startTime
、.JobQueueChange.jobQueueName
或.JobInited
,我们将其拆分为其组件。@csv
过滤器以您期望的格式输出结果数组。
注意,这忽略了您在对象的.type
上想要的过滤器,我认为这是可以的,因为.event
持有的对象也是特定的。
你可以在这里试试。
这是原始问题的答案:
根据类型AM_STARTED"json/index/row",我想要事件。AMStarted.startTime
根据类型JOB_QUEUE_CHANGED,我想要事件。JobQueueChange.jobQueueName
从类型JOB_INITED,我想要事件。JobInited。{launchTime,totalMaps,totalReduceds}
jq --raw-output '
map(
select(.type == "AM_STARTED").event.AMStarted.startTime,
select(.type == "JOB_QUEUE_CHANGED").event.JobQueueChange.jobQueueName,
select(.type == "JOB_INITED").event.JobInited["launchTime", "totalMaps", "totalReduces"]
)
| @csv'
在这里试试。
这是更新问题的答案:
根据类型AM_STARTED"json/index/row",我想要事件。AMStarted.startTime
忽略TASK_STARTED-我不想要任何类型中有"TASK"的字段
从JOB_INITED,我想要所有字段
从JOB_FINISHED,我想要finishTime和FILE_BYTES_READ&FILE_BYTES_writted
jq --raw-output '
map(
select(.type == "AM_STARTED").event.AMStarted.startTime,
select(.type == "JOB_INITED").event.JobInited[],
(
select(.type == "JOB_FINISHED").event.JobFinished
| .finishTime,
(
.totalCounters.groups[].counts[] | (
select(.name == "FILE_BYTES_READ").value,
select(.name == "FILE_BYTES_WRITTEN").value
)
)
)
)
| @csv
'
在这里试试。