2017-01-17 4 views
0

Ниже приведен код для генерации часто встречающихся наборов из улья таблицыFP алгоритм роста в искре с использованием улой таблицы

val sparkConf = new SparkConf().setAppName("Recommender").setMaster("local") 
val sc = new SparkContext(sparkConf) 
val hiveContext = new HiveContext(sc) 
import hiveContext.implicits._ 
import hiveContext.sql 

val schema = new StructType(Array(
StructField("col1", StringType, false) 
)) 

val dataRow = hiveContext.sql("select col1 from hive_table limit 100000").cache() 
val dataRDD = hiveContext.createDataFrame(dataRow.rdd,schema).cache() 
dataRDD.show() 

val transactions = dataRDD.map((row:Row) => { 
val stringarray=row.getAs[String](0).split(",") 
var arr=new Array[String](stringarray.length) 
for(a <- 0 to arr.length-1) { 
    arr(a)=stringarray(a) 
} 
arr 
}) 

val fpg = new FPGrowth().setMinSupport(0.1).setNumPartitions(10) 
val model = fpg.run(transactions) 
val size: Double = transactions.count() 
println("MODEL FreqItemCount "+model.freqItemsets.count()) 
println("Transactions count : "+size) 

Но FreqItemCount всегда оказывается 0.

В результате ввода запроса в показанный ниже

270035_1,249134_1,929747_1 
259138_1,44072_1,326046_1 
385448_1,747230_1,74440_1,68096_1,610434_1,215589_3,999507_1,74439_1,36260_1,925018_1,588394_1,986622_1,64585_1,942893_1,5421_1,37041_1,52500_1,4925_1,553613   415353_1,600036_1,75955_1 
693780_1,31379_1 
465624_1,28993_1,1899_2,823631_1 
667863_1,95623_3,345830_8,168966_1 
837337_1,95586_1,350341_1,67379_1,837347_1,20556_1,17567_1,77713_1,361216_1,39535_1,525748_1,646241_1,346425_1,219266_1,77717_1,179382_3,702935_1 
249882_1,28977_1 
78025_1,113415_1,136718_1,640967_1,787444_1 
193307_1,266303_1,220199_2,459193_1,352411_1,371579_1,45906_1,505334_1,9816_1,12627_1,135294_1,28182_1,132470_1 
526260_1,305646_1,65438_1 

Но когда я буду выполнять код с помощью следующего закодированного ввода, я получаю правильные часто встречающиеся наборы

val transactions = sc.parallelize(Seq(
    Array("Tuna", "Banana", "Strawberry"), 
    Array("Melon", "Milk", "Bread", "Strawberry"), 
    Array("Melon", "Kiwi", "Bread"), 
    Array("Bread", "Banana", "Strawberry"), 
    Array("Milk", "Tuna", "Tomato"), 
    Array("Pepper", "Melon", "Tomato"), 
    Array("Milk", "Strawberry", "Kiwi"), 
    Array("Kiwi", "Banana", "Tuna"), 
    Array("Pepper", "Melon") 
)) 

Не могли бы вы сообщить мне, что я делаю неправильно? Я использую искру 1.6.2 с помощью scala 2.10.

ответ

0

Похоже, что источником проблемы является слишком высокий порог поддержки (0,1). Ценность, которую вы используете, довольно высока и вряд ли будет наблюдаться в реальных транзакционных данных. Постарайтесь постепенно уменьшить его, вплоть до того момента, когда вы начнете получать правила.