Как я могу создать собственный SQLTransformer в PySpark ML для сводных данных

1

У меня есть кадр данных, который похож на следующую структуру:

# Prepare training data
training = spark.createDataFrame([
    (990011, 1001, 01, "Salary", 1000, 0.0),
    (990011, 1002, 02, "POS Purchase", 50, 0.0),
    (990022, 1003, 01, "Cash Withdrawl", 500, 1.0),
    (990022, 1004, 02, "Interest Charge", 35, 1.0)
], ["customer_id", "transaction_id", "week_of_year", "category", "amount", "label"])

Я могу динамически разворачивать эти данные, используя PySpark, что устраняет необходимость в заявлении о случаях жесткого кода для каждой недели и категории:

# Attempt 1
tx_pivot = training \
    .withColumn("week_of_year", sf.concat(sf.lit("T"), sf.col("week_of_year"))) \
    .groupBy("customer_id") \
    .pivot("week_of_year") \
    .sum("amount")

tx_pivot.show(20)

Я хотел бы разработать собственный Transformer для динамического изменения данных, чтобы я мог включить этот настраиваемый этап Transform в Spark ML Pipeline. К сожалению, текущий SQLTransfomer в Spark/PySpark поддерживает только SQL, например Eg 'SELECT... FROM THIS ' (см. Https://github.com/apache/spark/blob/master/python/pyspark/ml/feature.py).

Было бы высоко оценено любое руководство по тому, как создавать настраиваемый Transformer для динамически сворачиваемых данных.

Теги:
apache-spark
pyspark
apache-spark-mllib

1 ответ

1

Это довольно сложно реализовать пользовательский трансформатор, который принимает данные и возвращает другой фрейм данных. В твоем случае:

import pyspark.ml.pipeline.Transformer as Transformer

class PivotTransformer(Transformer):

    def _transform(self, data):           
        return data.withColumn("week_of_year",sf.concat(sf.lit("T"),\
                    sf.col("week_of_year"))) \
                   .groupBy("customer_id") \
                   .pivot("week_of_year") \
                   .sum("amount")
  • 0
    Потрясающие! Большое спасибо @manu valdes

Ещё вопросы

Сообщество Overcoder
Наверх
Меню