1

样本数据集:

$, Claw         "OnCreativity" (2012)  [Himself]

$, Homo         Nykytaiteen museo (1986)  [Himself]  <25>
            Suuri illusioni (1985)  [Guests]  <22>

$, Steve        E.R. Sluts (2003) (V)  <12>

$hort, Too      2012 AVN Awards Show (2012) (TV)  [Himself - Musical Guest]
            2012 AVN Red Carpet Show (2012) (TV)  [Himself]
            5th Annual VH1 Hip Hop Honors (2008) (TV)  [Himself]
            American Pimp (1999)  [Too $hort]

我使用以下代码创建了一个键值对 RDD:

To split data: val actorTuple = actor.map(l => l.split("\t"))
 To make KV pair: val actorKV = actorTuple.map(l => (l(0), l(l.length-1))).filter{case(x,y) => y != "" }

控制台上的键值 RDD 输出:

Array(($, Claw,"OnCreativity" (2012)  [Himself]), ($, Homo,Nykytaiteen museo (1986)  [Himself]  <25>), ("",Suuri illusioni (1985)  [Guests]  <22>), ($, Steve,E.R. Sluts (2003) (V)  <12>).......

但是,由于数据集的性质,很多行都有这个“”作为键,即空白(参见上面的 RDD 输出),所以,如果它是,我想要一个函数将前一行的演员复制到这一行空的。如何做到这一点。

4

2 回答 2

1

继续 xyzzy 给出的想法,在将文件作为字符串加载后尝试一下如何:

val actorFileSplit = actorsFile.split("\n\n")
val actorData = sc.parallelize(actorsFileSplit)
val actorDataSplit = actorsData.map(x => x.split("\t+",2).toList).map(line => (line(0), line(1).split("\n\t+").toList))

为了解释我在做什么,我首先在每次找到换行符时拆分字符串。连续地,我将其并行化为用于映射函数的 sparkcontext。然后我将每个条目分成两部分,由第一次出现的多个选项卡(一个或多个)分隔。第一部分现在应该是演员,第二部分仍然应该是带有电影标题的字符串。第二部分可以再次在每个新行处拆分,后跟多个制表符。这应该为每个演员创建一个包含所有标题的列表。最终结果的形式为:

actorDataSplit = [(String, [String])]

祝你好运

于 2014-11-18T07:08:09.830 回答
1

Spark 和 Scala 的新手。但也许改变你对行的解析会更简单,首先创建一个具有列表类型值的对 RDD,例如。

($, Homo, (Nykytaiteen museo (1986) [Himself] <25>,Suuri Imaginei (1985) [Guests] <22>)

我不知道您的数据,但也许如果一行不以“$”开头,您将附加到值列表中。

然后根据你想要做什么,也许你可以在上面描述的对 RDD 上使用 flatMapValues(func) 。这应用了一个函数,该函数将迭代器返回到 RDD 对的每个值,并且对于返回的每个元素,使用旧键生成一个键值条目。

添加:您的输入数据(“示例数据集”)采用什么格式?它是文本文件还是 .tsv?您可能想一次加载整个文件。也就是说,使用 .wholeTextFiles() 而不是 .textFile() 来加载数据。这是因为您的记录存储在文件中的多行中。

已添加我不打算下载该文件,但在我看来,您感兴趣的每条记录都以“$”开头。Spark 可以与任何 Hadoop 输入格式一起使用,因此请检查这些格式以查看是否有一种适用于您的示例数据。

如果没有,您可以编写自己的 Hadoop InputFormat 实现,将文件解析为按此字符拆分的记录,而不是 TextFiles 的默认值,即 '\n' 字符。

于 2014-11-12T20:48:49.610 回答