Получить конкретный ряд из искрового информационного кадра

Есть ли альтернатива для df[100, c("column")] в scala кадрах искровых данных. Я хочу выбрать конкретную строку из столбца кадра данных искры. например 100th строка в эквивалентном коде R

Ответ 1

Во-первых, вы должны понимать, что DataFrames распределены, что означает, что вы не можете получить к ним доступ в типичном процедуре, сначала вы должны выполнить анализ. Хотя, вы спрашиваете о Scala, я предлагаю вам прочитать Документацию Pyspark, потому что в ней есть больше примеров, чем любая другая документация.

Однако, продолжая мои объяснения, я бы использовал некоторые методы API RDD, потому что все DataFrame имеют один атрибут RDD. Пожалуйста, см. Мой пример ниже, и обратите внимание на то, как я беру 2-ю запись.

df = sqlContext.createDataFrame([("a", 1), ("b", 2), ("c", 3)], ["letter", "name"])
myIndex = 1
values = (df.rdd.zipWithIndex()
            .filter(lambda ((l, v), i): i == myIndex)
            .map(lambda ((l,v), i): (l, v))
            .collect())

print(values[0])
# (u'b', 2)

Надеюсь, кто-то даст другое решение с меньшим количеством шагов.

Ответ 2

Вот как я достиг этого в Scala. Я не уверен, что он более эффективен, чем действительный ответ, но он требует меньше кодирования

val parquetFileDF = sqlContext.read.parquet("myParquetFule.parquet")

val myRow7th = parquetFileDF.rdd.take(7).last

Ответ 3

Функция getrows() ниже должна получить getrows() вам строки.

Для полноты я записал полный код, чтобы воспроизвести вывод.

# Create SparkSession
from pyspark.sql import SparkSession
spark = SparkSession.builder.master('local').appName('scratch').getOrCreate()

# Create the dataframe
df = spark.createDataFrame([("a", 1), ("b", 2), ("c", 3)], ["letter", "name"])

# Function to get rows at 'rownums'
def getrows(df, rownums=None):
    return df.rdd.zipWithIndex().filter(lambda x: x[1] in rownums).map(lambda x: x[0])

# Get rows at positions 0 and 2.
getrows(df, rownums=[0, 2]).collect()

# Output:
#> [(Row(letter='a', name=1)), (Row(letter='c', name=3))]

Ответ 4

Существует способ скала (если у вас достаточно памяти на работающей машине):

val arr = df.select("column").rdd.collect
println(arr(100))

Если схема dataframe неизвестна и вы знаете фактический тип поля "column" (например, double), вы можете получить arr следующим образом:

val arr = df.select($"column".cast("Double")).as[Double].rdd.collect

Ответ 5

В PySpark, если ваш набор данных небольшой (может уместиться в памяти драйвера), вы можете сделать

df.collect()[n]

где df - объект DataFrame, а n - представляющая интерес строка. После получения Row вы можете сделать row.myColumn или row["myColumn"] чтобы получить содержимое, как указано в документации API.

Ответ 6

Вы можете просто сделать это, используя ниже одну строку кода

val arr = df.select("column").collect()(99)