web-dev-qa-db-fra.com

obtenir une ligne spécifique de la base de données

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

20
nareshbabral

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 DataFrames 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.

13
Alberto Bonsanto

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
7
Ignacio Alorre

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))]
3
Selva

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
0
Oleg Svechkarenko