Доступ к определенной строке из фрейма данных spark - PullRequest
0 голосов
/ 25 октября 2019

Я новичок в лазурных свечах / блоках данных и пытаюсь получить доступ к определенной строке, например, к 10-й строке в фрейме данных.

Это то, что я делал в блокноте до сих пор

1,Прочитать файл CSV в таблице

spark.read
  .format("csv")
  .option("header", "true")
  .load("/mnt/training/enb/commonfiles/ramp.csv")
  .write
  .mode("overwrite")
  .saveAsTable("ramp_csv")

2. Создайте DataFrame для «таблицы» ramp_csv

val rampDF = spark.read.table("ramp_csv")

3. Прочитайте конкретную строку

Я использую следующую логику в Scala

val myRow1st = rampDF.rdd.take(10).last

display(myRow1st)

, и она должна отображать 10-ю строку, но я получаю следующую ошибку

command-2264596624884586:9: error: overloaded method value display with alternatives:
  [A](data: Seq[A])(implicit evidence$1: reflect.runtime.universe.TypeTag[A])Unit <and>
  (dataset: org.apache.spark.sql.Dataset[_],streamName: String,trigger: org.apache.spark.sql.streaming.Trigger,checkpointLocation: String)Unit <and>
  (model: org.apache.spark.ml.classification.DecisionTreeClassificationModel)Unit <and>
  (model: org.apache.spark.ml.regression.DecisionTreeRegressionModel)Unit <and>
  (model: org.apache.spark.ml.clustering.KMeansModel)Unit <and>
  (model: org.apache.spark.mllib.clustering.KMeansModel)Unit <and>
  (documentable: com.databricks.dbutils_v1.WithHelpMethods)Unit
 cannot be applied to (org.apache.spark.sql.Row)
display(myRow1st)
^
Command took 0.12 seconds --

Не могли бы вы поделиться тем, что мне здесь не хватает? Я попробовал несколько других вещей, но это не сработало. Заранее спасибо за помощь!

Ответы [ 3 ]

1 голос
/ 25 октября 2019

Вот разбивка того, что происходит в вашем коде:

rampDF.rdd.take(10) возвращает Array[Row]

.last возвращает Row

display()занимает Dataset, а вы передаете его Row. Вы можете использовать .show(10) для отображения первых 10 строк в табличной форме.

Другой вариант - сделать display(rampDF.limit(10))

0 голосов
/ 30 октября 2019

Я также согласен с ответом Жуана Гитаны. Альтернатива для получения именно 10-й записи:

val df = 1 to 1000 toDF
val tenth = df.limit(10).collect.toList.last
tenth: org.apache.spark.sql.Row = [10]

, которая вернет 10-ю Row для этого df

0 голосов
/ 27 октября 2019

Я бы тоже пошел с ответом Жуана. Но если вы настаиваете на получении N-й строки как DataFrame и избегаете сбора в узел драйвера (скажем, когда N очень большой), вы можете сделать:

import org.apache.spark.sql.functions._
import spark.implicits._

val df = 1 to 100 toDF //sample data
val cols = df.columns

df
.limit(10)
.withColumn("id", monotonically_increasing_id())
.agg(max(struct(("id" +: cols).map(col(_)):_*)).alias("tenth"))
.select(cols.map(c => col("tenth."+c).alias(c)):_*)

Это вернет:

+-----+
|value|
+-----+
|   10|
+-----+
...