Проблема с использованием функции карты для преобразования кортежа на искровых Scala - PullRequest
2 голосов
/ 05 июля 2019

У меня есть этот кортеж

val tuple_test = ("NCA-15","select count(*) from table")

Я хочу преобразовать кортеж, чтобы сохранить первое значение NCA-15 И выполнить запрос select count(*) from table

Это результат Iхочу

(NCA-15,8)

, где 8 - результат запроса

Я пробовал это:

val resultat = tuple_test
    .productIterator
    .map {
       case(x: String, y: String) => (x, spark.sql(y.toString))
    }

, но он возвращает

resultat = non-empty iterator

1 Ответ

1 голос
/ 05 июля 2019

select "NCA-15",count(*) from table даст NCA-15,8 в виде фрейма данных, а .rdd сделает Rdd[Row] из Rdd[Row], вы можете сделать кортеж.

см. Ниже мой пример пончика ... так как у меня нет Hive, я смоделировал с temptable

  package com.examples


import org.apache.log4j.Level
import org.apache.spark.sql.{Row, SparkSession}

/**
  * Created by Ram Ghadiyaram
  */
object RDDOfTupleExample {
  org.apache.log4j.Logger.getLogger("org").setLevel(Level.ERROR)

  def main(args: Array[String]) {

    val spark = SparkSession.builder.
      master("local")
      .appName(this.getClass.getName)
      .getOrCreate()

    val donuts = Seq(("plain donut", 1.50), ("plain donut", 1.50)
      , ("vanilla donut", 2.0), ("vanilla donut", 2.0)
      , ("glazed donut", 2.50))
    val df = spark
      .createDataFrame(donuts)
      .toDF("Donut_Name", "Price")
    //lets suppose this is your hive table since i dont have hive i simulated with temp table
    df.createOrReplaceTempView("mydonuts")
    spark.sql("select \"NCA-15\" as mylabel, count(Donut_Name) as mydonutcount from mydonuts")
      .rdd.map((x: Row) => (x.get(0), x.get(1)))
      .foreach(println)
  }
}

Результат:

(NCA-15,5)
...