簡體   English   中英

如何將數據從大熊貓數據幀加載到Spark數據幀

[英]How to load data in chunks from a pandas dataframe to a spark dataframe

我已經通過像這樣的pyodbc連接讀取了大塊數據:

import pandas as pd
import pyodbc
conn = pyodbc.connect("Some connection Details")
sql = "SELECT * from TABLES;"
df1 = pd.read_sql(sql,conn,chunksize=10)

現在,我想使用以下方法將所有這些塊讀取到一個單一的火花數據幀中:

i = 0
for chunk in df1:
    if i==0:
        df2 = sqlContext.createDataFrame(chunk)
    else:
        df2.unionAll(sqlContext.createDataFrame(chunk))
    i = i+1

問題是當我執行df2.count()我得到的結果為10,這意味着只有i = 0的情況有效,這是unionAll的錯誤。 我在這里做錯什么了嗎?

.unionAll()的文檔指出,它返回一個新的數據.unionAll() ,因此您必須將其分配回df2框:

i = 0
for chunk in df1:
    if i==0:
        df2 = sqlContext.createDataFrame(chunk)
    else:
        df2 = df2.unionAll(sqlContext.createDataFrame(chunk))
    i = i+1

此外,您可以改為使用enumerate()避免自己管理i變量:

for i,chunk in enumerate(df1):
    if i == 0:
        df2 = sqlContext.createDataFrame(chunk)
    else:
        df2 = df2.unionAll(sqlContext.createDataFrame(chunk))

此外, .unionAll()的文檔指出已棄用.unionAll() ,現在您應該使用.union() ,其行為類似於SQL中的UNION ALL:

for i,chunk in enumerate(df1):
    if i == 0:
        df2 = sqlContext.createDataFrame(chunk)
    else:
        df2 = df2.union(sqlContext.createDataFrame(chunk))

編輯:
此外,我將不再繼續說,但在我進一步說之前,不要再說了:正如@ zero323所說的,我們不要在循環中使用.union() 讓我們做一些類似的事情:

def unionAll(*dfs):
    ' by @zero323 from here: http://stackoverflow.com/a/33744540/42346 '
    first, *rest = dfs  # Python 3.x, for 2.x you'll have to unpack manually
    return first.sql_ctx.createDataFrame(
        first.sql_ctx._sc.union([df.rdd for df in dfs]),
        first.schema
    )

df_list = []
for chunk in df1:
    df_list.append(sqlContext.createDataFrame(chunk))

df_all = unionAll(df_list)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM