Existe-t-il une alternative pour df[100, c("column")]
dans les trames de données scala spark? Je souhaite sélectionner une ligne spécifique dans une colonne du cadre de données d'allumage . Par exemple, 100th
ligne du code R ci-dessus
Tout d'abord, vous devez comprendre que DataFrames
sont distribués, ce qui signifie que vous ne pouvez pas y accéder de manière typique procédurale, vous devez d'abord effectuer une analyse. Bien que vous posiez une question à propos de Scala
, je vous suggère de lire le Pyspark Documentation , car il contient plus d'exemples que les autres documentations.
Cependant, continuant mon explication, j’utiliserais certaines méthodes de l’API RDD
car tous les DataFrame
s ont un RDD
comme attribut. S'il vous plaît, voir mon exemple ci-dessous, et remarquez comment je prends le 2ème disque.
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)
Espérons que quelqu'un donne une autre solution en moins d'étapes.
C'est ainsi que j'ai réalisé la même chose à Scala. Je ne suis pas sûr que ce soit plus efficace que la réponse valide, mais cela nécessite moins de codage
val parquetFileDF = sqlContext.read.parquet("myParquetFule.parquet")
val myRow7th = parquetFileDF.rdd.take(7).last
La fonction getrows()
ci-dessous devrait obtenir les lignes spécifiques souhaitées.
Pour être complet, j'ai écrit le code complet afin de reproduire le résultat.
# 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))]
Il y a un moyen de scala (si vous avez assez de mémoire sur la machine en fonctionnement):
val arr = df.select("column").rdd.collect
println(arr(100))
Si le schéma de structure de données est inconnu et que vous connaissez le type actuel du champ "column"
(par exemple, double), vous pouvez obtenir arr
comme suit:
val arr = df.select($"column".cast("Double")).as[Double].rdd.collect