Problème de base: strong> Je veux copier la "première ligne" d'un Spark Dataframe Je ne comprends pas ce qui ne va pas dans le code suivant.
Par conséquent, je suis impatient d'une solution et d'une explication ce qui échoue dans mon exemple minimal. P> un exemple minimal: strong> p> comme le résultat exspecté pour question : strong>
Ce qui m'a confondu, c'est ce qui suit: à l'aide de Val rangée = sdf.limit (1) Je pensais avoir créé un objet permanent / immuable / bien défini. Telle que lorsque je l'imprime une fois et que je l'ajoutez à quelque chose, je reçois les mêmes résultats. P> Remarque: Strong> (Merci beaucoup aux remarques de Daniel) P> Je sais que dans le monde distribué de Scala, il n'y a pas de notion bien définie de "première rangée". Je l'ai mis là-bas pour la simplicité et j'espère que les personnes qui se battent avec quelque chose de similaire "utilisent accidentellement" le terme "premier". P> Ce que j'essaie d'atteindre est ce qui suit: (Dans un exemple simplifié)
J'ai une trame de données avec 2 colonnes A et B. La colonne A est partiellement commandée et la colonne B est totalement commandée.
Je veux filtrer les données w.r.t. Les colonnes. L'idée est donc une sorte de division et de conquérir: diviser la trame de données, de sorte que dans des morceaux les deux colonnes sont totalement commandées et que de filtrer comme d'habitude. (et faire les itérations évidentes) p> pour atteindre cela, je dois choisir une ligne bien définie et diviser la date à laquelle w.r.t. rangée.a. Mais comme l'exemple minimal montre que mes comands ne produisent pas d'objet bien défini. P> Merci beaucoup P> P> sdf code> à une autre Spark Dataframe
sdfempty code>. P>
ligne code> est: strong> p>
sdfempty code> est : strong> p>
3 Réponses :
Spark est distribué, la notion de «premier» n'est pas quelque chose que nous pouvons compter sur. Dépendamment sur la partition, nous pouvons obtenir un résultat différent lorsque vous appelez avoir des résultats cohérents, vos données doivent avoir un ordre sous-jacent que nous pouvons utiliser - ce qui a beaucoup de sens, car sauf s'il y a une commande logique à vos données, nous ne pouvons pas vraiment dire ce qui signifie que cela signifie que première rangée. p>
En supposant que vous souhaitiez prendre la première rangée par rapport à la colonne A, vous pouvez simplement exécuter (* J'assume Scala API a le même nom de nommer que Python, alors s'il vous plaît corriger-moi si elles sont différemment nommées) p> limite code> ou
premier code>. p>
chy ("a"). Premier () code> (*). Bien que si la colonne A ait plus d'une ligne avec la même valeur la plus petite, aucune garantie que vous obtiendrez. p>
Cher Daniel, merci pour la réponse. Je sais que dans le monde distribué de l'étincelle, il n'y a pas une commande bien définie des lignes de l'ensemble de données. C'est pourquoi j'ai utilisé des guillemets. De plus, dans mon cas d'utilisation particulière, j'ai juste besoin de choisir un élément arbitaire mais fixe W.R.T. quelques commandes. Ce qui m'a confondu est ce qui suit: Utilisation de Val rang = sdf.limit (1) code> Je pensais créer un objet permanent / immuable / bien défini. Telle que lorsque je l'imprime une fois et que je l'ajoutez à quelque chose, j'ai les mêmes résultats.
Salut christian, .limit code> est juste une transformation - il n'est pas évalué avant votre exécution avec une action, telle que
Afficher code> ou
collecter code>, Do Dépendre sur le contexte, il peut renvoyer une valeur différente. Si vous souhaitez utiliser cette ligne de manière cohérente, vous pouvez
.Collectez code> sur pilote et utiliser comme variable locale ou assurez-vous que vos transformations ont une commande déterministe avec
.Orderby code>
Salut Daniel! Merci pour l'explication, mais mon code était déjà: Val rang = sdf.limit (1) rangée.show () sdfempty = sdfempty.union (rangée) code> donc je n'ai pas pensé avec show () va commencer l'évaluation. Je suis un peu afraind d'utiliser Collect (), car il s'écrase si les données ne correspondent pas à la mémoire des pilotes, n'est-ce pas? J'ai utilisé Orderby dans une étape précédente et je ne l'ai pas mentionné, de garder l'exemple aussi petit que possible. Cependant, je suis prêt pour tous les conseils de style qui m'aident à améliorer poser des questions et je suis également heureux pour votre aswer que j'utilise Scala depuis 1 semaine et ...
.Collect code> ne tombera que si le résultat de votre requête est plus grand que la mémoire - ce qui en cas de lecture d'une seule ligne est plutôt impossible. Je suis content de pouvoir aider - veuillez accepter la réponse et l'upvote si vous l'avez trouvé utile :)
@christian Vous pouvez atteindre ce résultat en utilisant une fonction de prise. Prenez (NUM) Prenez les premiers éléments numés de la RDD. Il fonctionne selon d'abord une partition et utilisez les résultats de cette partition pour estimer le nombre de partitions supplémentaires nécessaires pour satisfaire la limite.
Ici, l'extrait de code. P>scala> import org.apache.spark.sql.types._ scala> val sdf = Seq( (1, "a"), (12, "b"), (234, "b") ).toDF("A", "B") scala> import org.apache.spark.sql._ scala> var sdfEmpty = spark.createDataFrame(sc.emptyRDD[Row], sdf.schema) scala> var first1 =sdf.rdd.take(1) scala> val first_row = spark.createDataFrame(sc.parallelize(first1), sdf.schema) scala> sdfEmpty.union(first_row).show +---+---+ | A| B| +---+---+ | 1| a| +---+---+
Salut Mahesh Gupta, (et Daniel) Question stupide: Utiliser Prendre CODE> Donne-moi un tableau que je dois ensuite convertir en une trame de données. qui me semble une étape supplémentaire. En comparant celui-ci à
Collect () Code>, quelle approche serait plus efficace. À la fin de la question, la question fait partie d'une fonction, que je vais appeler en millions. Malheureusement, je suis nouveau à Scala et je n'ai aucune idée de la façon dont la création d'un exemple important et aléatoire par moi-même. Exigences: la colonne A est commandée partiallyle (par exemple, une tablette de commande définie par sous-ensemble) et la colonne B est totalement commandée. Précisément je ne sais pas comment créer une colonne A.
@Christian Veuillez lire ce Umbertogriffo.gitbooks.io / ... vous irez à connaître prise à vs collectionner
Je pose cette réponse car elle contient la solution suggérée par Daniel. Une fois que je suis grâce à la littérature fournie à Mahesh Gupta ou à d'autres tests, je vais mettre à jour cette réponse et donner des remarques sur les travaux des différentes approches de la "vie réelle".
Je veux copier la "première ligne" d'une étincelle Dataframe Comme dans le monde distribué de l'étincelle, il n'y a pas une notion bien définie d'en premier, mais quelque chose de similaire pourrait être obtenu en raison de sdf code> à une autre Spark Dataframe
sdfempty code>. P>
Orderby code>. P>
+---+---+
| A| B|
+---+---+
| 1| a|
+---+---+
Pouvez-vous partager la sortie de
println (sdf.rdd.partition.Size) code>?
@ MoriartTy007 La sortie de println (sdf.rdd.partition.Size) est 3.