我想在spark中进行单词计数,我使用spark sql创建了一个rdd来从数据集中提取不同的推文。 我想在RDD之上使用split函数,但它不允许我这样做。
错误: - valuse split不是org.apache.spark.sql.SchemaRdd
的成员无法进行字数统计的Spark代码: -
val disitnct_tweets=hiveCtx.sql("select distinct(text) from tweets_table where text <> ''")
val distinct_tweets_List=sc.parallelize(List(distinct_tweets))
//tried split on both the rdd disnt worked
distinct_tweets.flatmap(line => line.split(" ")).map(word => (word,1)).reduceByKey(_+_)
distinct_tweets_List.flatmap(line => line.split(" ")).map(word => (word,1)).reduceByKey(_+_)
但是当我将sparksql中的数据输出到文件并再次加载并运行拆分时,它就可以了。
有效的示例代码: -
val distinct_tweets=hiveCtx.sql("select dsitinct(text) from tweets_table where text <> ''")
val distinct_tweets_op=distinct_tweets.collect()
val rdd=sc.parallelize(distinct_tweets_op)
rdd.saveAsTextFile("/home/cloudera/bdp/op")
val textFile=sc.textFile("/home/cloudera/bdp/op/part-00000")
val counts=textFile.flatMap(line => line.split(" ")).map(word => (word,1)).reduceByKey(_+_)
counts.SaveAsTextFile("/home/cloudera/bdp/wordcount")
我需要一个答案而不是写入文件并再次加载以执行我的分割功能是否有解决功能的工作
由于
答案 0 :(得分:1)
首先,我们不应该执行collect()然后并行化来创建RDD;这将使司机忙碌/失望。
相反,
val distinct_tweets=hiveCtx.sql("select dsitinct(text) from tweets_table where text <> ''")
val distinct_tweets_op=distinct_tweets.map(x => x.mkstring)
[考虑到这一点,您只选择查询中的单个列 - distinct(text)
]
现在distinct_tweets_op只是一个RDD。
所以,循环遍历这个RDD;你最好在该RDD中的每个字符串上应用split(“”)函数。
答案 1 :(得分:0)
找到答案,将数据帧或spark.sql.row.RDD转换为普通RDD的三步过程。
sc.parallelize(列表()) 映射到字符串
val distinct_tweets=hiveCtx.sql(" select distinct(text) from tweets_table where text <> ''")
val distinct_tweets_op=distinct_tweets.collect()
val distinct_tweets_list=sc.parallelize(List(distinct_tweets_op))
val distinct_tweets_string=distinct_tweets.map(x=>x.toString)
val test_kali=distinct_tweets_string.flatMap(line =>line.split(" ")).map(word => (word,1)).reduceByKey(_+_).sortBy {case (key,value) => -value}.map { case (key,value) => Array(key,value).mkString(",") }
test_kali.collect().foreach(println)
case class kali_test(text: String)
val test_kali_op=test_kali.map(_.split(" ")).map(p => kali_test(p(0)))
test_kali_op.registerTempTable("kali_test")
hiveCtx.sql(" select * from kali_test limit 10 ").collect().foreach(println)
这种方式我不需要加载文件,我可以在飞行中进行操作。
由于 斯里兰卡
答案 2 :(得分:0)
你的第一个失败的主要原因是这一行:
var container = $('#notif');
container.append('<form></form>')
var form = container.children('form');
form.append('First name: ')
.append('<input type="text" name="name" value="' + data.name + '"\>')
.append('<br>Email:')
.append('<input type="text" name="email" value="' + data.email + '"\>');
这在Spark中完全没用,而且比无用还要糟糕 - 正如你所看到的那样,它会使你的系统陷入困境。
您希望避免执行val distinct_tweets_List=sc.parallelize(List(distinct_tweets))
,这会创建collect()
并将其返回到驱动程序应用程序。相反,您希望尽可能长时间地将对象保留为RDD,并尽可能少地将数据返回到驱动程序(如减少后的键和计数)。
但是要回答您的基本问题,以下内容将采用由单个StringType列组成的DataFrame并将其转换为RDD [String]:
Array
虽然SchemaRDDs不再存在,但我相信以下内容会将SchemaRDD与单个String列转换为普通的RDD [String]:
val myRdd = myDf.rdd.map(_.getString(0))