Выберите столбцы, содержащие тип массива и нормальный тип со всеми сглаживать - PullRequest
1 голос
/ 10 июля 2019
i have a dataframe with these column. Column 1 and Column2 are array and rest of the columns are string I need to get the value of the both using select.
    +-----------+-------------+--------------------+-----------+--------+
    |Column1    |    COLUMN2  |       NAME         |STATUS     |Sequence|
    +-----------+-------------+--------------------+-----------+--------+
    |      [ABC]|        [ABC]|         BILAL AHMAD|       ID-N|       1|
    |      [ABC]|        [ABC]|        JUNAID Ali  |       ID-N|       1|
    |      [ABC]|        [ABC]|         BILAL ZAFAR|       ID-N|       1|
    |      [ABC]|        [ABC]|              KHALID|       ID-N|       1|
    |      [ABC]|        [ABC]|              KASHIF|       ID-N|       1|
    |      [ABC]|        [ABC]|              SALMAN|       ID-N|       2|
    +-----------+-------------+--------------------+-----------+--------+

Я попытался использовать указанный ниже код.df.select($"*")

и

var seqCols = Seq("NAME","STATUS","sequence")

val allColumnsArr  =  "LEAD_CO_MNE" +: seqCols

df.select(colNames1.map(c=> col(c).getItem(0)):_* )

column1 и column2 являются массивами, поэтому с помощью getItem (0) я получу массив 1-й элемент.но это не работает для строковых столбцов.и строковые столбцы также являются динамическими, как когда-то они, как указано выше, некоторые имена столбцов строки времени имеют вид «DATE», «AMOUNT», «MODE»

+-----------+-------------+--------------------+-----------+--------+
|Column1    |    COLUMN2  |       NAME         |STATUS     |Sequence|
+-----------+-------------+--------------------+-----------+--------+
|      ABC  |        ABC  |         BILAL AHMAD|       ID-N|       1|
|      ABC  |        ABC  |        JUNAID Ali  |       ID-N|       1|
|      ABC  |        ABC  |         BILAL ZAFAR|       ID-N|       1|
|      ABC  |        ABC  |      KHALID|       ID-N|       1|
|      ABC  |        ABC  |      KASHIF|       ID-N|       1|
|      ABC  |        ABC  |              SALMAN|       ID-N|       2|
+-----------+-------------+--------------------+-----------+--------+

"[]" эти скобки удалены из column1 иСтолбец2 и теперь у меня есть столбец1 и столбец2 в виде строки

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

Тип столбца можно проверить, а если массив - получить первый элемент:

val df = Seq(
  (Array("ABC"), Array("ABC"), "BILAL AHMAD", "ID-N", 1),
  (Array("ABC"), Array("ABC"), "JUNAID Ali", "ID-N", 1)
).toDF("Column1", "COLUMN2", "NAME", "STATUS", "Sequence")

val columnsToSelect = df.schema.map(c => if (c.dataType.isInstanceOf[ArrayType]) col(c.name).getItem(0).alias(c.name) else col(c.name))
df.select(columnsToSelect: _*)

Выход:

+-------+-------+-----------+------+--------+
|Column1|COLUMN2|NAME       |STATUS|Sequence|
+-------+-------+-----------+------+--------+
|ABC    |ABC    |BILAL AHMAD|ID-N  |1       |
|ABC    |ABC    |JUNAID Ali |ID-N  |1       |
+-------+-------+-----------+------+--------+
0 голосов
/ 10 июля 2019

Вы можете взорвать массив столбцов и выбрать как обычно

val df = spark.sparkContext.parallelize(Seq(
  (Array("ABC"), Array("ABC"), "BILAL AHMAD", "ID-N", "1"),
  (Array("ABC"), Array("ABC"), "JUNAID Ali", "ID-N", "1"),
  (Array("ABC"), Array("ABC"), "BILAL ZAFAR", "ID-N", "1")
)).toDF("Column1", "COLUMN2", "NAME", "STATUS", "Sequence")

Разбить столбец типа массива или вы можете также выбрать только первый из массива здесь

val dfNew = df.schema.foldLeft(df) { (acc, schema) =>
  schema.dataType.typeName match {
    case "array" => acc.withColumn(schema.name, explode(col(schema.name)))
    case _ => acc
  }
}

dfNew.select("*").show(false)

Выход:

+-------+-------+-----------+------+--------+
|Column1|COLUMN2|NAME       |STATUS|Sequence|
+-------+-------+-----------+------+--------+
|ABC    |ABC    |BILAL AHMAD|ID-N  |1       |
|ABC    |ABC    |JUNAID Ali |ID-N  |1       |
|ABC    |ABC    |BILAL ZAFAR|ID-N  |1       |
+-------+-------+-----------+------+--------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...