簡體   English   中英

從 pySpark 中的 dict 構建一行

[英]Building a row from a dict in pySpark

我正在嘗試在 pySpark 1.6.1 中動態構建一行,然后將其構建到數據幀中。 總體思路是將describe的結果擴展為包括,例如,偏斜和峰度。 這是我認為應該起作用的:

from pyspark.sql import Row

row_dict = {'C0': -1.1990072635132698,
            'C3': 0.12605772684660232,
            'C4': 0.5760856026559944,
            'C5': 0.1951877800894315,
            'C6': 24.72378589441825,
            'summary': 'kurtosis'}

new_row = Row(row_dict)

但這會返回TypeError: sequence item 0: expected string, dict found這是一個相當明顯的錯誤。 然后我發現如果我先定義 Row 字段,我可以使用一個字典:

r = Row('summary', 'C0', 'C3', 'C4', 'C5', 'C6')
r(row_dict)
> Row(summary={'summary': 'kurtosis', 'C3': 0.12605772684660232, 'C0': -1.1990072635132698, 'C6': 24.72378589441825, 'C5': 0.1951877800894315, 'C4': 0.5760856026559944})

這將是一個很好的步驟,但似乎我不能動態指定Row的字段。 我需要它來處理未知名稱的未知行數。 根據文檔,您實際上可以采用另一種方式:

>>> Row(name="Alice", age=11).asDict() == {'name': 'Alice', 'age': 11}
True

所以看起來我應該能夠做到這一點。 似乎舊版本中可能有一些已棄用的功能允許這樣做,例如這里 是否有我缺少的當前等效項?

您可以使用關鍵字參數解包,如下所示:

Row(**row_dict)

## Row(C0=-1.1990072635132698, C3=0.12605772684660232, C4=0.5760856026559944, 
##     C5=0.1951877800894315, C6=24.72378589441825, summary='kurtosis')

需要注意的是,它在內部按關鍵字數據進行排序以解決舊 Python 版本的問題

此行為可能會在即將發布的版本中刪除- 請參閱SPARK-29748刪除 PySpark SQL 行創建中的字段排序 一旦它被刪除,你必須確保dict中值的順序在記錄中是一致的。

如果 dict 沒有變平,您可以遞歸地將 dict 轉換為 Row。

def as_row(obj):
    if isinstance(obj, dict):
        dictionary = {k: as_row(v) for k, v in obj.items()}
        return Row(**dictionary)
    elif isinstance(obj, list):
        return [as_row(v) for v in obj]
    else:
        return obj

暫無
暫無

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

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