2015-11-25 3 views
0

У меня есть текстовый файл в форматеScala, чтобы найти общие ценности между двумя списками

a,b,c,d,e 
f,g,h,i,j 
b,g,k,l,m 
g,h,o,p,q 

Я хочу выходной файл, который содержит только те строки, значения которых в первом столбце доступно в любом из второго столбца , Например, в этом случае значения в первом столбце последних двух строк являются «b» и «g», которые также доступны где-то во втором столбце. Поэтому мой требуемый вывод имеет только две строки.

b,g,k,l,m 
g,h,o,p,q 

Согласно моему решению, у меня есть два списка столбцов 1 и столбец 2 с различными значениями. Теперь, как я могу увидеть, доступны ли значения в столбце 1 в столбце2. Связанный код:

import org.apache.spark.SparkContext 
import org.apache.spark.SparkContext._ 

import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.fs.FileSystem; 
import org.apache.hadoop.fs.Path; 

import org.apache.commons.io.IOUtils; 
import scala.io.StdIn.{readLine, readInt} 
import scala.io.Source 

object SimpleApp { 
    def main(args: Array[String]) { 
    val logFile = "src/data/s1.txt" 

    val sc = new SparkContext("spark://Hadoop1:7077", "Simple App", "/usr/local/spark", 
    List("/usr/local/spark/SimpleSparkProject/target/scala-2.11/simple-project_2.11-1.0.jar")) 
    val lD = sc.textFile(logFile).cache() 

    val d2Map = lD map(col2) 
    val Column2 = d2Map.distinct 

    val d1Map = lD map(col1) 
    val Column1 = d1Map.distinct 

    // Now, here I want only those values in Column1 Which are available in Column2 

    //Column2.saveAsTextFile("hdfs://Hadoop1:9000/user/output/distDestination") 
    } 




    def col2(s:String) : (String) = { 
    val kv = s.split(",") 
    val k = kv(1) 
    k 
    } 

    def col1(s:String) : (String) = { 
    val kv = s.split(",") 
    val k = kv(0) 
    k 
    } 

} 
+1

Каковы некоторые из вещей, которые вы пробовали? Пожалуйста, напишите код, над которым вы работали, чтобы мы знали, как вам помочь. – Confiqure

+0

См. Мой отредактированный вопрос – Ahmad

+0

Как насчет 'scala> List (" b "," g "," k "," l "," m "). Intersect (List (" g "," h "," o " , "p", "q")) res4: Список [String] = Список (g) ' –

ответ

0

Этот код написан на чистой скале, не используя искру, но я надеюсь, что это вам поможет.

val str = "a,b,c,d,e\n" + 
    "f,g,h,i,j\n" + 
    "b,g,k,l,m\n" + 
    "g,h,o,p,q" 

val rows = str.split("\n") 
val splittedRows = rows.map(_.split(",")) 

val stringsInSecondColumn = splittedRows.map(_.apply(1)).toSet  

val result = splittedRows.filter { row => 
    stringsInSecondColumn.contains(row.apply(0)) 
} 
result.foreach(x => println(x.mkString(","))) 

Линии выше результата val stringsInSecondColumn - это просто синтаксический анализ строк. Чем мы получаем всю строку во втором столбце и литейный контейнер с ними, чтобы установить линейное время поиска. И нам просто нужно отфильтровать все строки и проверить, можно ли найти первое значение в наборе stringsInSecondColumn.

В своем коде вы можете сделать следующие вещи:

val stringsInSecondColumn = lD.map(_.split(",")(1)).toSet 
val filteredRows = lD.filter(row => stringsInSecondColumn.contains(row.split(",")(0))) 

Надеется, что это поможет.

+0

В соответствии с вашей рекомендацией я добавил следующую часть в мой код , но я получаю указанную ниже ошибку val lD = sc .textFile (LOGFILE) .cache() вал splittedRows = lD.map (. _ раскол ("")) вал stringsInSecondColumn = splittedRows.map (. _ применить (1)) toSet Ошибка. значение toSet не является членом org.apache.spark.rdd.RDD [String] – Ahmad

+0

@Ahmad пытается использовать разные, а не toSet. Я никогда не работал с Spark раньше и не знал этого api. Согласно их аргументу api, вы должны помочь https://spark.apache.org/docs/0.6.0/api/core/spark/RDD.html. –

Смежные вопросы