web-dev-qa-db-ja.com

Pysparkで空のデータフレームを定義し、それに対応するデータフレームを追加するにはどうすればよいですか?

だから私はディレクトリから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)

どんな助けにも本当に感謝します。

ありがとう

4
Gaurav Chawla

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)
7
Nim J

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)
2
Abhishek Bansal

これが私のやり方です。空の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
0
MathLal

最初にスキーマを定義してから、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)
0
Rong Du