Nano Hash - криптовалюты, майнинг, программирование

разархивировать список кортежей в кадре данных pyspark

Я хочу разархивировать список кортежей в столбце фрейма данных pyspark.

Скажем, столбец как [(blue, 0.5), (red, 0.1), (green, 0.7)], я хочу разделить на два столбца, с первым столбцом как [blue, red, green] и вторым столбцом как [0.5, 0.1, 0.7]

+-----+-------------------------------------------+
|Topic|  Tokens                                   |
+-----+-------------------------------------------+
|    1|  ('blue', 0.5),('red', 0.1),('green', 0.7)|
|    2|  ('red', 0.9),('cyan', 0.5),('white', 0.4)|
+-----+-------------------------------------------+

который можно создать с помощью этого кода:

df = sqlCtx.createDataFrame(
    [
        (1, ('blue', 0.5),('red', 0.1),('green', 0.7)),
        (2, ('red', 0.9),('cyan', 0.5),('white', 0.4))
    ],
    ('Topic', 'Tokens')
)

И вывод должен выглядеть так:

+-----+--------------------------+-----------------+
|Topic|  Tokens                  | Weights         |
+-----+--------------------------+-----------------+
|    1|  ['blue', 'red', 'green']| [0.5, 0.1, 0.7] |
|    2|  ['red', 'cyan', 'white']| [0.9, 0.5, 0.4] |
+-----+--------------------------------------------+


Ответы:


1

Если схема вашего DataFrame выглядит так:

 root
  |-- Topic: long (nullable = true)
  |-- Tokens: array (nullable = true)
  |    |-- element: struct (containsNull = true)
  |    |    |-- _1: string (nullable = true)
  |    |    |-- _2: double (nullable = true)

то вы можете выбрать:

from pyspark.sql.functions import col

df.select(
    col("Topic"),
    col("Tokens._1").alias("Tokens"), col("Tokens._2").alias("weights")
).show()
# +-----+------------------+---------------+       
# |Topic|            Tokens|        weights|
# +-----+------------------+---------------+
# |    1|[blue, red, green]|[0.5, 0.1, 0.7]|
# |    2|[red, cyan, white]|[0.9, 0.5, 0.4]|
# +-----+------------------+---------------+

И обобщенно:

cols = [
    col("Tokens.{}".format(n)) for n in 
    df.schema["Tokens"].dataType.elementType.names]

df.select("Topic", *cols)

Ссылка Запрос Spark SQL DataFrame со сложными типами

25.01.2018
  • Узнавайте что-то новое каждый день. 25.01.2018

  • 2

    Этого можно добиться с помощью простого индексирования с помощью udf():

    from pyspark.sql.functions import udf, col
    
    # create the dataframe
    df = sqlCtx.createDataFrame(
        [
            (1, [('blue', 0.5),('red', 0.1),('green', 0.7)]),
            (2, [('red', 0.9),('cyan', 0.5),('white', 0.4)])
        ],
        ('Topic', 'Tokens')
    )
    
    def get_colors(l):
        return [x[0] for x in l] 
    
    def get_weights(l):
        return [x[1] for x in l]
    
    # make udfs from the above functions - Note the return types
    get_colors_udf = udf(get_colors, ArrayType(StringType()))
    get_weights_udf = udf(get_weights, ArrayType(FloatType()))
    
    # use withColumn and apply the udfs
    df.withColumn('Weights', get_weights_udf(col('Tokens')))\
        .withColumn('Tokens', get_colors_udf(col('Tokens')))\
        .select(['Topic', 'Tokens', 'Weights'])\
        .show()
    

    Выход:

    +-----+------------------+---------------+
    |Topic|            Tokens|        Weights|
    +-----+------------------+---------------+
    |    1|[blue, red, green]|[0.5, 0.1, 0.7]|
    |    2|[red, cyan, white]|[0.9, 0.5, 0.4]|
    +-----+------------------+---------------+
    
    25.01.2018
  • Хорошо, но вам не нужен UDF :) 25.01.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..