Извлечение значений столбцов фрейма данных в виде списка в Apache Spark
Я хотел бы преобразовать строковый столбец фрейма данных в список. Что я могу найти от Dataframe API-это RDD, поэтому я попытался сначала преобразовать его обратно в RDD, а затем применить toArray функция для RDD. В этом случае длина и SQL работают просто отлично. Однако результат, который я получил от RDD, имеет квадратные скобки вокруг каждого элемента, подобного этому [A00001]. Мне было интересно, если есть способ преобразовать столбец в список или способ снять квадратные скобки.
любой предложения будут оценены. Спасибо!
5 ответов:
Это должно вернуть коллекцию, содержащую один список:
dataFrame.select("YOUR_COLUMN_NAME").rdd.map(r => r(0)).collect()без сопоставления вы просто получаете объект строки, который содержит каждый столбец из базы данных.
имейте в виду, что это, вероятно, даст вам список любого типа. Если вы хотите указать тип результата, вы можете использовать .asInstanceOf[YOUR_TYPE] in
r => r(0).asInstanceOf[YOUR_TYPE]картографияP. S. Из-за автоматического преобразования можно пропустить
.rddчасть.
С Искрой 2.x и Scala 2.11
я бы подумал о 3 возможных способах преобразования значений определенного столбца в List
общие фрагменты кода для всех подходов
import org.apache.spark.sql.SparkSession val spark = SparkSession.builder.getOrCreate import spark.implicits._ // for .toDf() method val df = Seq( ("first", 2.0), ("test", 1.5), ("choose", 8.0) ).toDF("id", "val")подход 1
df.select("id").collect().map(_(0)).toList // res9: List[Any] = List(one, two, three)что происходит сейчас? Мы собираем данные для драйвера с
collect()и выбор нулевого элемента из каждой записи.это не может быть отличным способом сделать это, давайте улучшим его со следующим подход.
подход 2
df.select("id").rdd.map(r => r(0)).collect.toList //res10: List[Any] = List(one, two, three)как это лучше? Мы распределили нагрузку преобразования карт между рабочими, а не одним драйвером.
я знаю
rdd.map(r => r(0))не кажется вам элегантным. Итак, давайте рассмотрим его в следующем подходе.
подход 3
df.select("id").map(r => r.getString(0)).collect.toList //res11: List[String] = List(one, two, three)здесь мы не преобразуем фрейм данных в RDD. Посмотри на
mapон не приметr => r(0)(или_(0)) как предыдущий подход из-за проблем с кодировщиком в фрейме данных. Так что в конечном итоге с помощьюr => r.getString(0)и это будет рассмотрено в следующих версиях Spark.вывод
все варианты дают тот же результат, но 2 и 3 эффективны, наконец, 3-й является эффективным и элегантным(я думаю).
Databricks notebook link, который будет доступен до 6 месяцев с 2017/05/20
Я знаю, что ответ, данный и запрошенный, предполагается для Scala, поэтому я просто предоставляю небольшой фрагмент кода Python, если пользователю PySpark любопытно. Синтаксис похож на данный ответ, но чтобы правильно вывести список, мне действительно нужно второй раз ссылаться на имя столбца в функции отображения, и мне не нужен оператор select.
т. е. фрейм данных, содержащий столбец с именем "Raw"
чтобы получить каждое значение строки в " Raw " объединены в виде списка, где каждая запись-это значение строки из "Raw", которое я просто использую:
MyDataFrame.rdd.map(lambda x: x.Raw).collect()
в Scala и Spark 2+, попробуйте это (предполагая, что имя столбца "s"):
df.select('s).as[String].collect
sqlContext.sql(" select filename from tempTable").rdd.map(r => r(0)).collect.toList.foreach(out_streamfn.println) //remove bracketsон отлично работает
Comments