Как проверить наличие ключа в типе карты spark sql - PullRequest
0 голосов
/ 07 сентября 2018

Итак, у меня есть таблица с одним столбцом типа карты (ключ и значение являются строками).

Я хотел бы написать иск SQL, как этот, чтобы проверить, существует ли данный ключ на карте.

select count(*) from my_table where map_contains_key(map_column, "testKey")

Я не смог найти ни одной существующей функции spark sql, которая могла бы сделать это.

Есть идеи?

Спасибо

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

Разобрался. Следующий SQL-запрос работает

select count(*) from my_table where map_column["testKey"] is not null
0 голосов
/ 28 июня 2019

Решение не будет работать, если testKey отсутствует в схеме DataFrame, это приведет к ошибке No such struct field.

Вы должны написать небольшой UDF для проверки, например:

import org.apache.spark.sql.functions.udf
import org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema
import org.apache.spark.sql.Row

spark.udf.register("struct_get", (root:GenericRowWithSchema, path: String, defaultValue: String) => {

    var fields = path.split("\\.")
    var buffer:Row = root
    val lastItem = fields.last

    fields = fields.dropRight(1)

    fields.foreach( (field:String) => {
        if (buffer != null) {
            if (buffer.schema.fieldNames.contains(field)) {
                buffer = buffer.getStruct(buffer.fieldIndex(field))
            } else {
                buffer = null
            }
        }
    })

    if (buffer == null) {
        defaultValue
    } else {
        buffer.getString(buffer.fieldIndex(lastItem))
    }
})
SELECT struct_get(mapColumn, "testKey", "") FROM my_table
0 голосов
/ 07 сентября 2018

Можно использовать такую ​​конструкцию:

df.where($"map_column"("testKey").isNotNull)

Для чистого sql:

spark.sql("select * from my_table where mapColumn[\"testKey\"] is not null")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...