Je suis assez nouveau sur pyspark et j'essaie de l'utiliser pour traiter un grand ensemble de données qui est enregistré en tant que fichier csv. Je voudrais lire le fichier CSV dans spark dataframe, supprimer quelques colonnes et ajouter de nouvelles colonnes. Comment dois-je procéder?
J'ai du mal à intégrer ces données dans une trame de données. Ceci est une version allégée de ce que j'ai jusqu'à présent:
def make_dataframe(data_portion, schema, sql):
fields = data_portion.split(",")
return sql.createDateFrame([(fields[0], fields[1])], schema=schema)
if __name__ == "__main__":
sc = SparkContext(appName="Test")
sql = SQLContext(sc)
...
big_frame = data.flatMap(lambda line: make_dataframe(line, schema, sql))
.reduce(lambda a, b: a.union(b))
big_frame.write \
.format("com.databricks.spark.redshift") \
.option("url", "jdbc:redshift://<...>") \
.option("dbtable", "my_table_copy") \
.option("tempdir", "s3n://path/for/temp/data") \
.mode("append") \
.save()
sc.stop()
Cela produit une erreur TypeError: 'JavaPackage' object is not callable
À l'étape de réduction.
Est-il possible de faire cela? L'idée de la réduction à une trame de données est de pouvoir écrire les données résultantes dans une base de données (Redshift, en utilisant le package spark-redshift).
J'ai également essayé d'utiliser unionAll()
et map()
avec partial()
mais je n'arrive pas à le faire fonctionner.
J'exécute cela sur EMR d'Amazon, avec spark-redshift_2.10:2.0.0
, Et le pilote JDBC d'Amazon RedshiftJDBC41-1.1.17.1017.jar
.
Mise à jour - répondant également à votre question dans les commentaires:
Lire les données du CSV vers le dataframe: Il semble que vous essayez seulement de lire le fichier CSV dans un spark dataframe.
Si oui - ma réponse ici: https://stackoverflow.com/a/37640154/5088142 couvrir cela.
Le code suivant doit lire CSV dans une trame de données spark
import pyspark
sc = pyspark.SparkContext()
sql = SQLContext(sc)
df = (sql.read
.format("com.databricks.spark.csv")
.option("header", "true")
.load("/path/to_csv.csv"))
// these lines are equivalent in Spark 2.0 - using [SparkSession][1]
from pyspark.sql import SparkSession
spark = SparkSession \
.builder \
.appName("Python Spark SQL basic example") \
.config("spark.some.config.option", "some-value") \
.getOrCreate()
spark.read.format("csv").option("header", "true").load("/path/to_csv.csv")
spark.read.option("header", "true").csv("/path/to_csv.csv")
colonne de dépôt
vous pouvez supprimer la colonne en utilisant "drop (col)" https://spark.Apache.org/docs/1.6.2/api/python/pyspark.sql.html
goutte (col)
Returns a new DataFrame that drops the specified column.
Parameters: col – a string name of the column to drop, or a Column to drop.
>>> df.drop('age').collect()
[Row(name=u'Alice'), Row(name=u'Bob')]
>>> df.drop(df.age).collect()
[Row(name=u'Alice'), Row(name=u'Bob')]
>>> df.join(df2, df.name == df2.name, 'inner').drop(df.name).collect()
[Row(age=5, height=85, name=u'Bob')]
>>> df.join(df2, df.name == df2.name, 'inner').drop(df2.name).collect()
[Row(age=5, name=u'Bob', height=85)]
ajouter une colonne Vous pouvez utiliser "withColumn" https://spark.Apache.org/docs/1.6.2/api/python/ pyspark.sql.html
withColumn (colName, col)
Returns a new DataFrame by adding a column or replacing the existing column that has the same name.
Parameters:
colName – string, name of the new column.
col – a Column expression for the new column.
>>> df.withColumn('age2', df.age + 2).collect()
[Row(age=2, name=u'Alice', age2=4), Row(age=5, name=u'Bob', age2=7)]
Remarque: spark possède de nombreuses autres fonctions qui peuvent être utilisées (par exemple, vous pouvez utiliser "sélectionner" au lieu de "supprimer")