Сохранение значения Spark DataFrame в переменной scala - PullRequest
1 голос
/ 12 апреля 2020

Мне нужно проверить повторяющееся имя файла в моей таблице, и если количество файлов равно 0, тогда мне нужно загрузить файл в мою таблицу, используя sparkSql. Я написал ниже код.

    val s1=spark.sql("select count(filename) from mytable where filename='myfile.csv'") //giving '2'
    s1: org.apache.spark.sql.DataFrame = [count(filename): bigint]
    s1.show //giving 2 as output

// s1 дает мне количество файлов из моей таблицы, тогда мне нужно сравнить это значение счетчика, используя оператор if. Я использую приведенный ниже код.

    val s2=s1.count   //not working always giving 1
    val s2=s1.head.count() // error: value count is not a member of org.apache.spark.sql.Row
    val s2=s1.size //value size is not a member of Unit
    if(s1>0){ //code } //value > is not a member of org.apache.spark.sql.DataFrame

Может кто-нибудь дать мне подсказку, как мне это сделать. Как я могу получить значение dataframe и может использовать в качестве переменной для проверки условия. то есть

    if(value of s1(i.e.2)>0){
    //my code
    }

Ответы [ 2 ]

0 голосов
/ 12 апреля 2020

spark.sql("select count(filename) from mytable where filename='myfile.csv'") возвращает фрейм данных, и вам нужно извлечь как первую строку, так и первый столбец этой строки. Гораздо проще напрямую отфильтровать набор данных и посчитать количество строк в Scala:

val s1 = df.filter($"filename" === "myfile.csv").count
if (s1 > 0) {
  ...
}

, где df - набор данных, соответствующий таблице mytable.

Если вы получили таблицу из какого-то другого источника и не зарегистрировали представление, используйте SparkSession.table(), чтобы получить фрейм данных, используя экземпляр SparkSession, который у вас уже есть. Например, в оболочке Spark предустановленная переменная spark содержит сеанс, и вы сделаете:

val df = spark.table("mytable")
val s1 = df.filter($"filename" === "myfile.csv").count
0 голосов
/ 12 апреля 2020

Вам нужно извлечь само значение. Count вернет количество строк в df, которое составляет всего одну строку.

Таким образом, вы можете сохранить исходный запрос и извлечь значение после с помощью методов first и getInt

val s1 = spark.sql("select count(filename) from mytable where filename='myfile.csv'")`
val valueToCompare = s1.first().getInt(0)

And затем:

  if(valueToCompare>0){
    //my code
    }

Другая опция выполняет подсчет вне запроса, тогда подсчет даст вам желаемое значение:

val s1 = spark.sql("select filename from mytable where filename='myfile.csv'")


   if(s1.count>0){
    //my code
    }

Мне нравится больше всего второй вариант, но нет другой причины, кроме этого, я думаю, что это более ясно

...