私はpysparkを初めて使用し、csvファイルとして保存されている大きなデータセットを処理するためにそれを使用しようとしています。 CSVファイルをspark dataframeに読み込み、いくつかの列をドロップして、新しい列を追加します。どうすればよいですか?
このデータをデータフレームに取り込むのに問題があります。これは私がこれまでに持ってきたものを取り除いたバージョンです:
_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()
_
これにより、reduceステップでエラー_TypeError: 'JavaPackage' object is not callable
_が生成されます。
これは可能ですか?データフレームに削減するアイデアは、結果のデータをデータベースに書き込むことができるようにすることです(Redshift、spark-redshiftパッケージを使用)。
また、unionAll()
とmap()
をpartial()
で使用してみましたが、機能しません。
これは、AmazonのEMRで_spark-redshift_2.10:2.0.0
_とAmazonのJDBCドライバー_RedshiftJDBC41-1.1.17.1017.jar
_を使用して実行しています。
更新-コメントであなたの質問にも答えます:
CSVからdataframeにデータを読み取ります:CSVファイルをspark dataframeに読み取ることのみを試みているようです。
もしそうなら-ここで私の答え: https://stackoverflow.com/a/37640154/5088142 これをカバーしてください。
以下のコードはCSVをspark-data-frameに読み込む必要があります
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")
ドロップカラム
「drop(col)」を使用して列をドロップできます https://spark.Apache.org/docs/1.6.2/api/python/pyspark.sql.html
ドロップ(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)]
add column "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)]
注:sparkには、使用できる他の多くの関数があります(たとえば、「drop」の代わりに「select」を使用できます)