Есть ли альтернатива для 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)