сгладить значения столбца фрейма данных искры и поместить его в переменную - PullRequest
0 голосов
/ 25 ноября 2018

Spark version 1.60, Scala version 2.10.5.

У меня есть spark-sql фрейм данных df, как это,

+-------------------------------------------------+
|addess         | attributes                      | 
+-------------------------------------------------+
|1314 44 Avenue |   Tours, Mechanics, Shopping    |                                                                                                                                 
|115 25th Ave   |   Restaurant, Mechanics, Brewery|                                                                 
+-------------------------------------------------+

С этого фрейма я хотел бы значения какниже,

Tours, Mechanics, Shopping, Brewery

Если я сделаю это,

df.select(df("attributes")).collect().foreach(println)

Я получу,

[Tours, Mechanics, Shopping]
[Restaurant, Mechanics, Brewery]

Я думал, что мог бы использовать flatMap вместо найденного this , поэтому попытался поместить это в переменную, используя

val allValues = df.withColumn(df("attributes"), explode("attributes"))

, но я получаю ошибку:

error: несоответствие типов;

найдено: org.apache.spark.sql.column

обязательно: строка

Я думал, смогу ли я получить вывод, используя explode Я могуиспользуйте distinct, чтобы получить уникальные значения после их выравнивания.

Как получить желаемый результат?

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Я настоятельно рекомендую вам использовать версию 2.x.В Cloudera, когда вы запускаете «spark-shell», он запускает версию 1.6.x. однако, если вы запускаете «spark2-shell», вы получаете оболочку 2.x.Проверьте с вашим администратором

Но если вам нужно с Spark 1.6 и решением rdd, попробуйте это.

import spark.implicits._
import scala.collection.mutable._
val df = Seq(("1314 44 Avenue",Array("Tours", "Mechanics", "Shopping")),
              ("115 25th Ave",Array("Restaurant", "Mechanics", "Brewery"))).toDF("address","attributes")
df.rdd.flatMap( x => x.getAs[mutable.WrappedArray[String]]("attributes") ).distinct().collect.foreach(println)

Результаты:

Brewery
Shopping
Mechanics
Restaurant
Tours

Если столбец «attribute» - это не массив, а строка, разделенная запятыми, используйте приведенный ниже столбец, который дает те же результаты

val df = Seq(("1314 44 Avenue","Tours,Mechanics,Shopping"),
  ("115 25th Ave","Restaurant,Mechanics,Brewery")).toDF("address","attributes")
df.rdd.flatMap( x => x.getAs[String]("attributes").split(",") ).distinct().collect.foreach(println)
0 голосов
/ 25 ноября 2018

Проблема в том, что withColumn ожидает String в своем первом аргументе (это имя добавляемого столбца) , но выпередавая ему столбец здесь df.withColumn(df("attributes").
Вам нужно только передать "attributes" как String .

Кроме того, вам нужно передать Столбец для explode функции , но вы передаете String - чтобы сделать его столбцом, вы можете использовать df("columName") или стенографию Scala $ синтаксис, $"columnName".

Надеюсь, этот пример поможет вам.

import org.apache.spark.sql.functions._
val allValues = df.select(explode($"attributes").as("attributes")).distinct

Обратите внимание, что при этом будет сохранен только столбец attributes , так как вы хотите, чтобы отдельные элементы на этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...