Как считать с помощью входных строк? - PullRequest
0 голосов
/ 29 мая 2020

Привет, я пытаюсь подсчитать максимальное значение в данной задаче, используя строку ввода. Решение проблемы: для двух месяцев x и y, где y> x, найдите имя хэштега, которое больше всего увеличило количество твитов с месяца x до месяца y. Мы уже написали код в вашем шаблоне кода, который считывает значения x и y с клавиатуры. Игнорируйте твиты в месяцах между x и y, поэтому просто сравните количество твитов в месяц x и в месяц y. Сообщите название хэштега, количество твитов в месяцах x и y. Игнорируйте любые имена хэштегов, для которых не было твитов ни в месяц x, ни в y. Вы можете предположить, что комбинация хэштега и месяца уникальна. Выведите результат на вывод терминала с помощью println. Для приведенного выше небольшого примера набора данных вывод должен быть следующим:

Input       x = 200910, y = 200912

Output  hashtagName: mycoolwife, countX: 1, countY: 500
Data Fomrat:

Token type  Month   count   Hash Tag Name

hashtag 200910  2   Babylove

hashtag 200911  2   babylove

hashtag 200912  90  babylove

Моя попытка:

// Load the input data and split each line into an array of strings
val twitterLines = sc.textFile("hdfs:///user/ashhall1616/bdc_data/twitter-small.tsv")
val twitterdata = twitterLines.map(_.split("\t"))

// Each month is a string formatted as YYYYMM
val x = scala.io.StdIn.readLine("x month: ")
val y = scala.io.StdIn.readLine("y month: ")

val matchmonth= twitterdata.map(r => (r(0)== x ,r(0)==y, r(2), r(3))).sortBy(_._3, false)
if(matchmonth.(r => (r(0))) < matchmonth.(r => (r(1)))
   {
       val ht1 = matchmonth.map(r => (r(2), r(3))).take(1)
       val ht2 = matchmonth.map(r => (r(2), r(3))).take(1,2)
           println("[" + ht1 + "," + ht2 + "]")
   }

получение ошибок:

 val matchmonth= twitterdata.map(r => (r(0)== x ,r(0)==y, r(2), r(3))).sortBy(_._3, false)
matchmonth: org.apache.spark.rdd.RDD[(Boolean, Boolean, String, String)] = MapPartitionsRDD[20] at sortBy at <console>:32
scala> if(matchmonth.(r => (r(0))) < matchmonth.(r => (r(1)))
<console>:1: error: identifier expected but '(' found.
if(matchmonth.(r => (r(0))) < matchmonth.(r => (r(1)))
              ^
<console>:1: error: identifier expected but '(' found.
if(matchmonth.(r => (r(0))) < matchmonth.(r => (r(1)))
                                         ^
scala>    {
     |        val ht1 = matchmonth.map(r => (r(2), r(3))).take(1)
     |        val ht2 = matchmonth.map(r => (r(2), r(3))).take(1,2)
     |            println("[" + ht1 + "," + ht2 + "]")
     |    }
<console>:36: error: (Boolean, Boolean, String, String) does not take parameters
              val ht1 = matchmonth.map(r => (r(2), r(3))).take(1)
                                              ^
<console>:36: error: (Boolean, Boolean, String, String) does not take parameters
              val ht1 = matchmonth.map(r => (r(2), r(3))).take(1)
                                                    ^
<console>:37: error: (Boolean, Boolean, String, String) does not take parameters
              val ht2 = matchmonth.map(r => (r(2), r(3))).take(1,2)
                                              ^
<console>:37: error: (Boolean, Boolean, String, String) does not take parameters
              val ht2 = matchmonth.map(r => (r(2), r(3))).take(1,2)

может кто-то посмотрите, что здесь не так?

1 Ответ

0 голосов
/ 29 мая 2020

Я предлагаю вам прочитать несколько статей о Spark SQL и DataFrame API.

matchmonth - это DataFrame (если это помогает, вы можете думать об этом как о таблице SQL). Использование его в выражении if не имеет смысла. Также очень полезно давать названия столбцам. например,

val twitterdata = twitterLines.map(_.split("\t")).toDF("tokenType", "month", "count", "hash")

Применив карту к данным twitterdata DataFrame, вы преобразовали ее из формы (String, String, String, String, String) в форму (Boolean, Boolean, String, String) - это то, что вы хотите?

if(matchmonth.(r => (r(0))) < matchmonth.(r => (r(1))) недопустимо синтаксис.

Для начала вы хотите выбрать строки, соответствующие вашему диапазону месяцев. Это вернет другой DataFrame. Оттуда я оставлю вам читать об искре sql. groupBy и sum наверняка вам помогут

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

val filteredDf = twitterdata.where($"month" >= lit(x) && $"month" <= lit(y))
...