だから私はディレクトリからcsvファイルをpysparkデータフレームとして読み取り、それらを単一のデータフレームに追加したいと思います。私たちがパンダで行うように、pysparkでこれの代替手段を得ていません。
たとえばパンダでは、次のようにします。
files=glob.glob(path +'*.csv')
df=pd.DataFrame()
for f in files:
dff=pd.read_csv(f,delimiter=',')
df.append(dff)
Pysparkでこれを試しましたが成功しませんでした
schema=StructType([])
union_df = sqlContext.createDataFrame(sc.emptyRDD(),schema)
for f in files:
dff = sqlContext.read.load(f,format='com.databricks.spark.csv',header='true',inferSchema='true',delimiter=',')
df=df.union_All(dff)
どんな助けにも本当に感謝します。
ありがとう
spark 2.1:
files=glob.glob(path +'*.csv')
for idx,f in enumerate(files):
if idx == 0:
df = spark.read.csv(f,header=True,inferSchema=True)
dff = df
else:
df = spark.read.csv(f,header=True,inferSchema=True)
dff=dff.unionAll(df)
2つのデータフレームで「unionAll」を使用する場合、スキーマは同じである必要があります。したがって、空のデータフレームのスキーマはcsvスキーマに従っている必要があります。
たとえば:
schema = StructType([
StructField("v1", LongType(), True), StructField("v2", StringType(), False), StructField("v3", StringType(), False)
])
df = sqlContext.createDataFrame([],schema)
または、次のようにすることもできます。
f = files.pop(0)
df = sqlContext.read.load(f,format='com.databricks.spark.csv',header='true',inferSchema='true',delimiter=',')
for f in files:
dff = sqlContext.read.load(f,format='com.databricks.spark.csv',header='true',inferSchema='true',delimiter=',')
df=df.union_All(dff)
これが私のやり方です。空のDataFrameは作成しません。
def concat_spark_iterator(iterator):
"""
:param iterator: iterator(Spark DataFrame)
:return: Concatenated Spark DataFrames
"""
df = next(iterator)
for _df in iterator:
df = df.union(_df)
return df
最初にスキーマを定義してから、unionAllを使用して新しいデータフレームを空のデータフレームに連結し、反復を実行して一連のデータフレームを結合することもできます。
from pyspark.sql.types import StructType
from pyspark.sql.types import StructField
from pyspark.sql.types import StringType
sc = SparkContext(conf=SparkConf())
spark = SparkSession(sc) # Need to use SparkSession(sc) to createDataFrame
schema = StructType([
StructField("column1",StringType(),True),
StructField("column2",StringType(),True)
])
empty = spark.createDataFrame(sc.emptyRDD(), schema)
empty = empty.unionAll(addOndata)