2015-04-25 3 views
1

Я получаю RDD[(String, Array[String])] и две функции, которые предназначены для поиска названий фильмов, заданных для фильма.как отформатировать вывод на печать в искрике

def find_name1(n : String, m: Map[String,String]) = { 
    print(n+":") 
    println(m.get(n).mkString) 
    } 
    def find_name2(n:Array[String], m: Map[String,String]) = { 
    print("here is what we recommend:") 
    for(i<-0 until n.length) 
    { 
     print(n(i)+":"+m.get(n(i)).mkString+",") 
    } 
    println() 
    } 

Тогда я печатающая работу таким образом

data.foreach{x=>find_name1(x._1,m.toMap) 
     find_name2(x._2,m.toMap)} 

результат должен быть четыре парка, но первым выглядит проводным. Это:

1375:1694:Apostle, The (1997) 
Star Trek III: The Search for Spock (1984) 
here is what we recommend:here is what we recommend:1373:Star Trek V: The Final Frontier (1989),1372:Star Trek VI: The Undiscovered Country (1991),994:Big Night (1996),329:Star Trek: Generations (1994),1810:Primary Colors (1998),2641:Superman II (1980),1120:People vs. Larry Flynt, The (1996),1371:Star Trek: The Motion Picture (1979),281:Nobody's Fool (1994),1635:Ice Storm, The (1997), 

Почему первые два идентификатора не печатаются как формат: ID: Имя. Похоже, что работа с печатью не выполняется по строкам в RDD: данные. Есть ли кто-нибудь, кто может сказать мне, почему это происходит? Как я могу форматировать вывод так, как хочу.

+0

Если вы запускаете это несколько раз, вы получаете тот же результат каждый раз? – maasg

+0

@maasg да, я получаю одинаковый результат каждый раз. –

ответ

1

Способ получения такого отчета от RDD будет состоять в том, чтобы преобразовать данные, пока не будет у вас все необходимые элементы, а затем в окончательном преобразовании создайте фактический отчет.

Кроме того, побочные функции обескуражены, поскольку они будут производить недетерминированные результаты в распределенной среде (в случае println, если вы используете кластер, вы даже не увидите их. локальный режим, поэтому он не масштабируемый)

Я хотел бы предложить следующие изменения (*):

def findMovieTitle(id: String) : String = ??? 

val recommendationReportRDD = movieDataRDD.map{case (id, recommendations) =>  
    val formatId: String => String = id => s"$id: ${findMovieTitle(id)}"  
    val recomStr = recommendations.map(id => formatId(id)).mkString(",")) 

    s"${formatId(id)}. We recommend: $recomStr" 
} 

Теперь вы можете гибко решать, что делать с отчетом.

Вы можете распечатать его:

recommendationReportRDD.collect.foreach(println _) 

Но также, вы можете сохранить его в файл:

recommendationReportRDD.saveAstTextFile("path/to/report.txt") 

(*) код, предоставленный для целей иллюстрации. Не компилируется и не тестируется.

+0

Я получил правильный формат вчера после того, как я изменил m в find_name1 и find_name2 на 'm: scala.collection.Map'. Я понятия не имею, почему он дает мне правильный формат. Теперь я практикуюсь в локальном режиме, если я не могу использовать println в кластере, что я рекомендую использовать? –

+0

@G_cy см. Этот ответ :-) мы все равно не будем использовать 'println' в большом приложении данных, поэтому, когда размеры данных начнут расти, мы будем писать в db или файловую систему для некоторых приложений, а именно для этого. – maasg

+0

Получите идею! спасибо за ваш обмен! У вас есть представление о том, почему я могу получить правильный формат после изменения m-определения. –

0

Практически все, что происходит с RDD, выполняется параллельно, поэтому, если вы хотите что-то сделать в линейном порядке, вы должны позвонить collect() перед такими операциями.