我正在尝试添加额外的"标记"列到Hbase表。标记是基于表行中存在的单词完成的。比方说,如果" Dark"出现在某一行,然后它的标签将被添加为"恐怖"。我已经在火花RDD中读取了表格中的所有行,并将它们与我们要标记的单词进行匹配。代码片段如下所示:
var hBaseRDD2=sc.newAPIHadoopRDD(conf,classOf[TableInputFormat],classOf[org.apache.hadoop.hbase.io.ImmutableBytesWritable], classOf[org.apache.hadoop.hbase.client.Result])
val transformedRDD = hBaseRDD2.map(tuple => {
(Bytes.toString(tuple._2.getValue(Bytes.toBytes("Moviesdata"),Bytes.toBytes("MovieName"))),
Bytes.toString(tuple._2.getValue(Bytes.toBytes("Moviesdata"),Bytes.toBytes("MovieSummary"))),
Bytes.toString(tuple._2.getValue(Bytes.toBytes("Moviesdata"),Bytes.toBytes("MovieActor")))
)
})
在这里," moviesdata"是HBase表的列家族和" MovieName"&" MovieSummary" &安培; " MovieActor"是列名。 " transformedRDD"在上面的代码片段中是RDD [String,String,String]类型。它已被转换为RDD [String]类型:
val arrayRDD: RDD[String] = transformedRDD.map(x => (x._1 + " " + x._2 + " " + x._3))
通过这样做,所有单词都被提取出来了:
val words = arrayRDD.map(x => x.split(" "))
我们在HBase表行中寻找的单词位于csv文件中。其中一个栏目,让我们说"同义词" csv的列有我们要查找的单词。 csv中的另一列是" target_tag"列,其中的单词将被标记到与之对应的行。 阅读csv:
val csv = sc.textFile("/tag/moviestagdata.csv")
阅读同义词列:(同义词列是第二列,因此" p(1)"在下面的代码段中)
val synonyms = csv.map(_.split(",")).map( p=>p(1))
读取target_tag列:( target_tag是第3列)
val targettag = csv.map(_.split(",")).map(p=>p(2))
同义词和targetag中的某些行包含多个字符串,并由" @@@"分隔。分离它们的片段是这样的:
val splitsyno = synonyms.map(x => x.split("@@@"))
val splittarget = targettag.map(x=>x.split("@@@"))
现在,为了匹配来自" splitsyno"的每个字符串,我们需要遍历每一行,并且进一步的行可能有很多字符串,因此,为了创建一组每个字符串,我做了这个:(创建了一个空集)
splitsyno.map(x=>x.foreach(y=>set += y)
将每个字符串与"单词"中的字符串匹配在上面创建,我这样做了:
val check = words.exists(set contains _)
现在,我面临的问题是,我并不完全知道csv中哪些行与HBase表中的行匹配的字符串。这是必需的,因为我需要找到相应的目标字符串以及要添加到HBase表中的哪一行。我应该怎么做呢?任何帮助都将受到高度赞赏。