2017-08-11 88 views
1

如何爲數據框創建實體拼塊創建功能?爲數據框創建實現拼花地板的功能

的數據幀,以鑲文件創建的語法是一樣的東西 - (pyspark)

df.write.mode( '覆蓋')實木複合地板( 「file_name.parquet」)

創建功能。對於這一點,我想以這樣的方式

def parquet_create(df_name,file_name): 
     df_name.write.mode('overwrite').parquet(file_name+".parquet") 
    return 

但是,當我與parquet_create運行( 「ABC」, 「EEE」)......它失敗

AttributeError: 'str' object has no attribute 'write' 

因此,我初始化了一個空的數據框到上面,有沒有更簡潔的方法來實現?

def parquet_create(df_name,file_name): 
     df_name = sqlContext.read.json("my_empty_file.parquet") 
     df_name = df_name.write.mode('overwrite').parquet(file_name+".parquet") 
     return 

如何做到這一點,如果數據幀initalized出功能?

+0

看起來你傳遞的是一個數據框的名稱,而不是對象本身 – bendl

+0

是的,我想通過數據幀的名稱,並使用上述功能,只要我想創建一個實木複合地板 – Viv

+0

從一個已經存在,還是一個你會在以後做?在我看來,你不需要創建一個空的parquet文件,並且如果你已經有一個填充的數據框,沒有理由不僅僅傳遞數據幀對象本身 – bendl

回答

1

您的代碼正在嘗試從名爲df_name的數據框創建一個parquet文件,該文件作爲參數傳遞。它接收到的不是一個數據幀,而是一個字符串,所以它失敗了。這裏理想的情況是,除了傳遞一個數據幀的字符串名稱,你的對象傳遞,就像這樣:

df = ... # define a dataframe 
filename = ... # some filename 
parquet_create(df, filename) 

這聽起來像那不是你出於某種原因的選項,所以有一對變通辦法。您可以創建與字符串數據框名稱數據幀的對象像這樣的詞典:

df = ... # define a dataframe 
df2 = ... # define another dataframe 
filename = ... # some filename 
name_map = {'df': df, 'df2': df2} 
parquet_create('df', filename) 

,並定義parquet_create這樣的:

def parquet_create(df_name, file_name): 
    name_map[df_name].write.mode('overwrite').parquet(file_name+".parquet") 

你必須確保name_map是在parquet_create範圍限定。

我能想到的唯一的其他選擇是使用eval

df = ... # define a dataframe 
filename = ... # some filename 
parquet_create(df, filename) 

def parquet_create(df_name, file_name): 
    eval(df_name).write.mode('overwrite').parquet(file_name+".parquet") 

注意,您還必須確保DF的parquet_create的這個解決方案的範圍爲好。

這兩個都是我心目中真正醜陋的解決方案,我真的不能想到不僅僅是傳遞數據框對象本身的原因,而是你去了。