Как создать схему PySpark для списка кортежей?

В Ruby вы можете использовать опцию 'm' (многострочный):

/YOUR_REGEXP/m

См. Regexp документацию на ruby-doc.org для получения дополнительной информации.

1
задан Ankan Dutta 4 March 2019 в 06:03
поделиться

2 ответа

Ответ Танджина должен работать, хотя я хотел бы предложить другой подход. Вместо того, чтобы узнать, сколько столбцов вы должны добавить в свою схему, чтобы создать столбец типа массив / список. Следующий код преобразует ваши данные в 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
ответ дан Alexandros Biratsis 4 March 2019 в 06:03
поделиться

Было бы полезно описать кортеж самостоятельно, прежде чем мы сделаем 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),
    ])
])
0
ответ дан Tanjin 4 March 2019 в 06:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: