Как создать схему PySpark для списка кортежей? - PullRequest
0 голосов
/ 03 марта 2019

Какой должна быть правильная PySpark Схема для следующего списка кортежей?Я хочу применить схему к следующим данным:

[('a', 0.0), ('b', 6), ('c', 44), ('d', 107), ('e', 0), ('f', 3), ('g', 4), ('h', 0.025599999353289604), ('i', 0.03239999711513519), ('j', -0.03205680847167969), ('k', 0.10429033637046814), ('l', (34.190006256103516, 31.09000015258789, 31.099994659423828)), ('m', (-9.32000732421875, -9.32000732421875, -11.610000610351562)) ]

Я хочу получить результат в следующем формате: Формат

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Ответ Танджина должен работать, хотя я хотел бы предложить другой подход.Вместо того, чтобы узнать, сколько столбцов вы должны добавить в свою схему, чтобы создать столбец типа массив / список.Следующий код преобразует ваши данные в rdd, который вместо кортежей содержит строки [key, value], где value - это список типа double.Затем вы можете легко применить приведенную ниже схему.

def test():
    l = [('a', 0.0), 
    ('b', 6), 
    ('c', 44), 
    ('d', 107), 
    ('e', 0), 
    ('f', 3), 
    ('g', 4), 
    ('h', 0.025599999353289604), 
    ('i', 0.03239999711513519), 
    ('j', -0.03205680847167969), 
    ('k',0.10429033637046814), 
    ('l',(34.190006256103516, 31.09000015258789, 31.099994659423828)), 
    ('m',(-9.32000732421875, -9.32000732421875, -11.610000610351562))]

    # this schema should work for all your cases 
    schema = StructType([
        StructField("id", StringType(), False),
        StructField("num_list", ArrayType(DoubleType(), True), True)
    ])

    rdd = spark.sparkContext.parallelize(l).map(lambda r: (r[0], to_float_list(r[1])))

    df = spark.createDataFrame(rdd, schema)

    df.show(100, False)

def to_float_list(value):
    if type(value) is tuple:  
        return list(map(float, value))

    return [float(value)]

Обратите внимание, что функция to_float_list принимает либо кортеж, либо число и преобразует его в список типа double.Это выведет:

+---+-----------------------------------------------------------+
|id |num_list                                                   |
+---+-----------------------------------------------------------+
|a  |[0.0]                                                      |
|b  |[6.0]                                                      |
|c  |[44.0]                                                     |
|d  |[107.0]                                                    |
|e  |[0.0]                                                      |
|f  |[3.0]                                                      |
|g  |[4.0]                                                      |
|h  |[0.025599999353289604]                                     |
|i  |[0.03239999711513519]                                      |
|j  |[-0.03205680847167969]                                     |
|k  |[0.10429033637046814]                                      |
|l  |[34.190006256103516, 31.09000015258789, 31.099994659423828]|
|m  |[-9.32000732421875, -9.32000732421875, -11.610000610351562]|
+---+-----------------------------------------------------------+
0 голосов
/ 03 марта 2019

Было бы полезно описать кортеж самостоятельно, прежде чем мы сделаем Spark-эквивалент.В Python кажется, что у вас есть кортеж с двумя элементами.Первый - это String, а второй - еще один кортеж, состоящий из значений 3 Double.Первые несколько элементов не обязательно соответствуют этому, но вы не можете ожидать наличия «динамической» схемы, но кажется, что как минимум String и первое число во втором кортеже всегда присутствуют.В любом случае, один из способов представить ваш тип этих данных: (String, (Double, Double, Double))

Соответствующая схема Pyspark для этого будет:

from pyspark.sql.types import StructType, StructField, StringType, DoubleType

schema = StructType([
    StructField('char', StringType(), nullable=False),
    StructType([
        StructField('num_1', DoubleType, nullable=False),
        StructField('num_2', DoubleType, nullable=True),
        StructField('num_3', DoubleType, nullable=True),
    ])
])
...