从多行记录中创建Spark数据结构

2024-09-26 22:49:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我在试着读入spark中的retrosheet事件文件。事件文件的结构是这样的。在

id,TEX201403310
version,2
info,visteam,PHI
info,hometeam,TEX
info,site,ARL02
info,date,2014/03/31
info,number,0
info,starttime,1:07PM
info,daynight,day
info,usedh,true
info,umphome,joycj901
info,attendance,49031
start,reveb001,"Ben Revere",0,1,8
start,rollj001,"Jimmy Rollins",0,2,6
start,utlec001,"Chase Utley",0,3,4
start,howar001,"Ryan Howard",0,4,3
start,byrdm001,"Marlon Byrd",0,5,9
id,TEX201404010
version,2
info,visteam,PHI
info,hometeam,TEX

正如你所看到的,每一场比赛事件都会循环回来。在

我已经将文件读入RDD,然后通过第二个for循环为每个迭代添加了一个键,这似乎是有效的。但我希望能得到一些反馈,如果有一个清洁的方法,这样做使用火花方法。在

^{pr2}$

Tags: 文件方法infoidversion事件结构start
1条回答
网友
1楼 · 发布于 2024-09-26 22:49:40

PySparksince version 1.1支持Hadoop Input Formats。可以使用textinputformat.record.delimiter选项使用自定义格式分隔符,如下所示

from operator import itemgetter

retrosheet = sc.newAPIHadoopFile(
    '/path/to/retrosheet/file',
    'org.apache.hadoop.mapreduce.lib.input.TextInputFormat',
    'org.apache.hadoop.io.LongWritable',
    'org.apache.hadoop.io.Text',
    conf={'textinputformat.record.delimiter': '\nid,'}
)
(retrosheet
    .filter(itemgetter(1))
    .values()
    .filter(lambda x: x)
    .map(lambda v: (
        v if v.startswith('id') else 'id,{0}'.format(v)).splitlines()))

从Spark 2.4开始,您还可以使用text读取器将数据读入DataFrame

^{pr2}$

相关问题 更多 >

    热门问题