как отфильтровать несколько строк в таблице с помощью Scala

#scala #apache-spark

#scala #apache-spark

Вопрос:

Используя Scala: у меня есть таблица emp, как показано ниже

 id, name,   dept,   address
1,  a,  10, hyd
2,  b,  10, blr
3,  a,  5,  chn
4,  d,  2,  hyd
5,  a,  3,  blr
6,  b,  2,  hyd
  

Код:

 val inputFile = sc.textFile("hdfs:/user/edu/emp.txt"); 
val inputRdd = inputFile.map(iLine => (iLine.split(",")(0),
                             iLine.split(",")(1), 
                             iLine.split(",")(3)
                            )); 
// filtering only few columns Now i want to pull hyd addressed employees complete data 
  

Проблема: я не хочу печатать все данные emp, я хочу напечатать только несколько данных emp, которые все из hyd.

  1. Я загрузил этот набор данных emp в Rdd
  2. Я разделил этот Rdd с помощью ‘,’
  3. теперь я хочу напечатать только emp, адресованный hyd.

Комментарии:

1. Где код?

2. val inputFile = sc.textFile(«hdfs:/user/edu/emp.txt «); val inputRdd = Входной файл.map(iLINE => (iLINE.split(«,»)(0),iLINE.split(«,»)(1), iLINE.split(«,»)(3))); // отфильтруйте только несколько столбцов, теперь я хочу получить полные данные сотрудников, адресованные hyd

3. Вы пробовали метод filter на RDD?

4. пожалуйста, поделитесь кодом для фильтрации строк в rdd

Ответ №1:

Я думаю, что приведенное ниже решение поможет решить вашу проблему.

   val fileName = "/path/stact_test.txt"
  val strRdd = sc.textFile(fileName).map { line =>
    val data = line.split(",")
    (data(0), data(1), data(3))
  }.filter(rec=>rec._3.toLowerCase.trim.equals("hyd"))
  

после разделения данных отфильтруйте местоположение, используя 3-й элемент из кортежа RDD.

Вывод:

 (1,  a, hyd)
(4,  d,  hyd)
(6,  b,  hyd)
  

Ответ №2:

Вы можете попробовать использовать dataframe

 
val viewsDF=spark.read.text("hdfs:/user/edu/emp.txt")
val splitedViewsDF = viewsDF.withColumn("id", split($"value",",").getItem(0))
                            .withColumn("name", split($"value", ",").getItem(1))
                            .withColumn("address", split($"value", ",").getItem(3))
                            .drop($"value")
                            .filter(df("address").equals("hyd") )

  

Комментарии:

1. спасибо, но я получаю сообщение об ошибке: <консоль>: 25: ошибка: перегруженный метод фильтрации значений с альтернативами: (функция: org.apache.spark.api.java.function. filterFunction[org.apache.spark.sql.Row])org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] <и> (функция: org.apache.spark.sql.Row => Логическое значение)org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] <и> (conditionExpr: Строка)org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] <и> (условие: org.apache.spark.sql.Column)org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] не может быть применен к (логическое значение)

2. попробуйте df(«адрес»).equals(«hyd»)