3 votes

Création de rangées d'étincelles sur une carte

J'ai vu un tutoriel sur les cadres de données à https://databricks.com/blog/2015/02/17/introducing-dataframes-in-spark-for-large-scale-data-science.html qui est écrit en Python . J'essaie de le traduire en Scala .

Ils ont le code suivant :

df = context.load("/path/to/people.json")
# RDD-style methods such as map, flatMap are available on DataFrames
# Split the bio text into multiple words.
words = df.select("bio").flatMap(lambda row: row.bio.split(" "))
# Create a new DataFrame to count the number of words
words_df = words.map(lambda w: Row(word=w, cnt=1)).toDF()
word_counts = words_df.groupBy("word").sum()

J'ai donc commencé par lire les données d'un csv dans un cadre de données df et je l'ai fait :

val title_words = df.select("title").flatMap { row =>    
  row.getAs[String("title").split(" ") }
val title_words_df = title_words.map( w => Row(w,1) ).toDF()
val word_counts = title_words_df.groupBy("word").sum()

mais je ne sais pas :

  1. comment attribuer les noms de champs aux lignes de la ligne commençant par val title_words_df = ...

  2. Je reçois l'erreur "The value toDF is not a member of org.apache.spark.rdd.RDD[org.apache.spark.sql.Row]"

Merci d'avance pour votre aide.

2voto

zero323 Points 5699

comment attribuer les noms des champs aux lignes

Python Row est un type d'objet assez différent de son homologue en Scala. Il s'agit d'un tuple augmenté de noms, ce qui le rend plus équivalent à un type de produit qu'à une collection non typée ( o.a.s.sql.Row ).

Je reçois l'erreur "The value toDF is not a member of org.apache.spark.rdd.RDD[org.apache.spark.sql.Row]"

Desde o.a.s.sql.Row est fondamentalement non typé, il ne peut pas être utilisé avec toDF et exige createDataFrame avec un schéma explicite.

import org.apache.spark.sql.types._

val schema = StructType(Seq(
  StructField("word", StringType), StructField("cnt", LongType)
))

sqlContext.createDataFrame(title_words.map(w => Row(w, 1L)), schema)

Si vous voulez que votre code soit équivalent à la version Python, vous devez utiliser des types de produits au lieu de Row . Il s'agit soit d'un Tuple :

title_words.map((_, 1L)).toDF("word", "cnt")

ou la classe de cas :

case class Record(word: String, cnt: Long)

title_words.map(Record(_, 1L)).toDF

Dans la pratique cependant, il ne devrait pas être nécessaire d'utiliser des RDD :

import org.apache.spark.sql.functions.{explode, lit, split}

df.select(explode(split($"title", " ")), lit(1L))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X