Как подсчитать различные значения в столбце после groupby в Scala Spark, используя mapGroups - PullRequest
0 голосов
/ 02 октября 2018

Я новичок в Scala Spark.у меня есть данные текстового файла как

001,delhi,india
002,chennai,india
003,hyderabad,india
004,newyork,us
005,chicago,us
006,lasvegas,us
007,seattle,us

Я хочу подсчитать количество различных городов в каждой стране, поэтому я применил groupBy и mapGroups.Я не уверен, как считать значения внутри mapGroups. Пожалуйста, найдите мой код ниже

val ds1 = sparkSession.read.textFile("samplefile.txt").map(x => x.split(","))
  val ds2 = ds1.groupByKey(x => x(2)).mapGroups{case(k,iter) => (k,iter.map(x => x(2)).toArray)}

Пожалуйста, помогите мне с синтаксисом.Я знаю, что это легко сделать с помощью spark-sql, но я хочу сделать это с помощью scala

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Для подсчета отдельных городов в каждой стране вы можете сопоставить список стран по массиву city и подсчитать количество отдельных городов:

val ds1 = spark.read.textFile("/path/to/textfile").map(_.split(","))
val ds2 = ds1.
  groupByKey(_(2)).mapGroups{ case (k, iter) =>
    (k, iter.map(_(1)).toList.distinct.size)
  }

[ОБНОВЛЕНИЕ]

Чтобы рассчитать среднее значение по стране, скажем, из 4-го числового столбца, сработало бы следующее:

val ds3 = ds1.
  groupByKey(_(2)).mapGroups{ case (k, iter) =>
    val numList = iter.map(_(3).toDouble).toList
    (k, numList.sum / numList.size)
  }

Если вам нужны различные виды числовых агрегаций, я думаю, что Spark DataFrame API будет более эффективным инструментом (например,имеет встроенную avg()).

0 голосов
/ 02 октября 2018

Правильный способ - сделать что-то вроде: df - ваш источник данных,

import org.apache.spark.sql.functions._

val df: DataFrame = ???

val result = df.groupBy("country col name").agg(countDistinct("city column name").alias("city_count"))

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...