我有一组非常烦人的文件,结构如下:
userId string,
eventType string,
source string,
errorCode string,
startDate timestamp,
endDate timestamp
每个文件可能包含每个eventid的任意数量的记录,具有不同的事件类型和源,每个文件的代码和开始/结束日期也不同。
在hive或spark中,有没有一种方法可以将所有这些内容在userid上分组,有点像键值,其中的值是与userid相关联的所有字段的列表?具体来说,我希望它是由事件类型和源键。基本上我想用table的长度来交换宽度,有点像一张透视表。我的目标是最终存储为apacheparquet或avro文件格式,以便将来进行更快速的分析。
举个例子:
源数据:
userId, eventType, source, errorCode, startDate, endDate
552113, 'ACK', 'PROVIDER', 0, '2017-09-01 12:01:45.432', '2017-09-01 12:01:45.452'
284723, 'ACK', 'PROVIDER', 0, '2017-09-01 12:01:45.675', '2017-09-01 12:01:45.775'
552113, 'TRADE', 'MERCH', 0, '2017-09-01 12:01:47.221', '2017-09-01 12:01:46.229'
552113, 'CHARGE', 'MERCH', 0, '2017-09-01 12:01:48.123', '2017-09-01 12:01:48.976'
284723, 'REFUND', 'MERCH', 1, '2017-09-01 12:01:48.275', '2017-09-01 12:01:48.947'
552113, 'CLOSE', 'PROVIDER', 0, '2017-09-01 12:01:49.908', '2017-09-01 12:01:50.623'
284723, 'CLOSE', 'PROVIDER', 0, '2017-09-01 12:01:50.112', '2017-09-01 12:01:50.777'
目标:
userId, eventTypeAckProvider, sourceAckProvider, errorCodeAckProvider, startDateAckProvider, endDateAckProvider, eventTypeTradeMerch, sourceTradeMerch, errorCodeTradeMerch, startDateTradeMerch, endDateTradeMerch, eventTypeChargeMerch, sourceChargeMerch, errorCodeChargeMerch, startDateChargeMerch, endDateChargeMerch, eventTypeCloseProvider, sourceCloseProvider, errorCodeCloseProvider, startDateCloseProvider, endDateCloseProvider, eventTypeRefundMerch, sourceRefundMerch, errorCodeRefundMerch, startDateRefundMerch, endDateRefundMerch
552113, 'ACK', 'PROVIDER', 0, '2017-09-01 12:01:45.432', '2017-09-01 12:01:45.452', 'TRADE', 'MERCH', 0, '2017-09-01 12:01:47.221', '2017-09-01 12:01:46.229', 'CHARGE', 'MERCH', 0, '2017-09-01 12:01:48.123', '2017-09-01 12:01:48.976', 'CLOSE', 'PROVIDER', 0, '2017-09-01 12:01:49.908', '2017-09-01 12:01:50.623', NULL, NULL, NULL, NULL, NULL
284723, 'ACK', 'PROVIDER', 0, '2017-09-01 12:01:45.675', '2017-09-01 12:01:45.775', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'CLOSE', 'PROVIDER', 0, '2017-09-01 12:01:50.112', '2017-09-01 12:01:50.777', 'REFUND', 'MERCH', 1, '2017-09-01 12:01:48.275', '2017-09-01 12:01:48.947'
字段名或顺序无关紧要,只要我能分辨出来。
我已经尝试了两种方法来实现这一点:
从表中手动选择每个组合并连接到主数据集。这工作得很好,并行性也很好,但是不允许为键字段提供任意数量的值,并且需要预定义模式。
使用spark创建key:value records 其中每个值都是一个字典。基本上,循环遍历数据集,如果字典不存在,则向其中添加一个新键;对于该条目,如果值字典不存在,则向其添加一个新字段。它工作得很漂亮,但是速度非常慢,而且并行性也不好。我也不确定这是否是一个avro/Parquet兼容的格式。
除了这两种方法,还有别的选择吗?或者比我的目标更好的结构?
2条答案
按热度按时间mwngjboj1#
你能试试这个并给出你的意见吗,
jckbn6z72#
你想要这样的吗?