2017-10-16 108 views
0

我在Spark中使用dataframe以tablular格式拆分和存儲數據。我在文件中的數據看起來如下 -使用spark python分割dataFrame

{"click_id": 123, "created_at": "2016-10-03T10:50:33", "product_id": 98373, "product_price": 220.50, "user_id": 1, "ip": "10.10.10.10"} 
{"click_id": 124, "created_at": "2017-02-03T10:51:33", "product_id": 97373, "product_price": 320.50, "user_id": 1, "ip": "10.13.10.10"} 
{"click_id": 125, "created_at": "2017-10-03T10:52:33", "product_id": 96373, "product_price": 20.50, "user_id": 1, "ip": "192.168.2.1"} 

,我已經寫了這個代碼,以分割數據 -

from pyspark.sql import Row 
from pyspark.sql import SparkSession 
from pyspark.sql import SQLContext 
import pyspark.sql.functions as psf 

spark = SparkSession \ 
    .builder \ 
    .appName("Hello") \ 
    .config("World") \ 
    .getOrCreate() 

sc = spark.sparkContext 
sqlContext = SQLContext(sc) 

ratings = spark.createDataFrame(
    sc.textFile("transactions.json").map(lambda l: l.split(',')), 
    ["Col1","Col2","Col3","Col4","Col5","Col6"] 
) 

ratings.registerTempTable("ratings") 

final_df = sqlContext.sql("select * from ratings"); 
final_df.show(20,False) 

上面的代碼工作正常,並給出了以下的輸出:

enter image description here

正如您從輸出中看到"click_id and number"正在顯示,同樣顯示created_at and timestamp正在顯示。

我想實際上只有表中的值 - click_id,created_at,product_id等。

如何僅將這些值存入我的表格中?

+0

你的意思是,刪除鍵('click_id,created_at'等),並只保留所有6列的值? – desertnaut

+0

@desertnaut是 – Firstname

回答

2

在你的地圖功能,解析,而不是分裂它

map(lambda l: l.split(',')) 

應該成爲

map(lambda l: json.loads(l)) 

(已導入後JSON)

import json 

此外,如果你的JSON對象刪除列定義

["Col1","Col2","Col3","Col4","Col5","Col6"] 

你會得到列從JSON

1

假設你希望只使用數據幀API,那麼你可以使用下面的代碼:

ratings = spark.read.json("transactions.json") 

這將JSON加載到數據幀,將json鍵映射到列名。 然後,您可以使用下面的代碼選擇並重命名列。

ratings = ratings.select(col('click_id').alias('Col1'), 
         col('created_at').alias('Col2'), 
         col('product_id').alias('Col3'), 
         col('product_price').alias('Col4'), 
         col('user_id').alias('Col5'), 
         col('ip').alias('Col6')) 

這樣,您也可以將列轉換爲相關的數據類型,例如, col('product_price').cast('double').alias('Col4')並正確保存到數據庫。

+0

有沒有辦法將單個列名存儲爲列表並將每個值作爲參數傳遞? – Firstname

+0

如果我正確理解你的意思,你可以有一個數組,例如'arr = [「Col1」,「Col2」,「Col3」,「Col4」,「Col5」,「Col6」]'並且執行'df = df.select(arr)' – geopet

+0

例如 - click_id到列表/數組中,並將這些值arr [0],arr [1]中的每一個傳遞給以click_id作爲輸入參數的函數get_value(click_id)@geopet – Firstname