value map不是org.apache.spark.sql.Row的成员

时间:2015-08-06 09:18:50

标签: scala twitter apache-spark

我在Twitter中发布了复杂模式中的推文,我试图从这些推文中提取文本,然后清理数据以进行进一步分析。我正在运行一个SQL查询来提取推文,然后当我尝试使用replaceAll或者替换来清理推文时,它一直在抛出异常

  

value map不是org.apache.spark.sql.Row

的成员

所以我试图寻找一个解决方案并遇到了这个How to write program in Spark to replace word,它有点类似但与字符串问题有关。我试图用嵌套的地图实现它,但似乎不起作用。

这是我的代码段:

 val tweets = sc.textFile(tweetInput).filter(l => l.trim !="")
 val tweetTable = sqlContext.jsonRDD(tweets)
 tweetTable.registerTempTable("tweetTable")
 sqlContext.cacheTable("tweetTable")

 // read all tweets from input files 
    val trimmed_tweets = sqlContext.sql("SELECT text FROM tweetTable WHERE text <> '' ")
      .map(x => x.map(_.replace("""([\p{Punct}&&[^.@]]|\b\p{IsLetter}{1,2}\b)\s*""", "")))
      .toLowerCase()
      .filter(_.nonEmpty)
      .flatMap(x=>x)

我也无法使用trimAs_tweets的saveAsTextFile选项,因为saveAsTextFile也不是org.apache.spark.sql.Row的成员

1 个答案:

答案 0 :(得分:2)

问题是您的操作是Row而不是String。首先,您必须从Row中提取存储在第一列中的推文文本。

 val trimmed_tweets = sqlContext.sql("SELECT text FROM tweetTable WHERE text <> '' ")
  .map(row => row.getString(0).replace("""([\p{Punct}&&[^.@]]|\b\p{IsLetter}{1,2}\b)\s*""", "")))
  .toLowerCase()
  .filter(_.nonEmpty)