Разветвленная искровая колонка DataFrame - PullRequest
0 голосов
/ 25 ноября 2018

Я использую spark 2.3

У меня есть такой DataFrame (в другой ситуации _c0 может содержать 20 внутренних полей):

_c0                     | _c1
-----------------------------
1.1   1.2          4.55 | a
4.44  3.1          9.99 | b
1.2   99.88        10.1 | x

Я хочу разделить _c0 и создатьновый DataFrame, подобный этому:

col1 |col2  |col3 |col4
-----------------------------
1.1  |1.2   |4.55 | a
4.44 |3.1   |9.99 | b
1.2  |99.88 |10.1 | x

Я знаю, как решить эту проблему с помощью getItem ():

df = originalDf.rdd.map(lambda x: (re.split(" +",x[0]),x[1])).toDF()
# now, df[0] is a array of string , and df[1] is string
df = df.select(df[0].getItem(0), df[0].getItem(1), df[0].getItem(2), df[1])

Но я надеялся найти другой способ решения этой проблемы, потому что _c0 может содержатьболее 3 внутренних столбцов.

Есть ли способ использовать flatMap для генерации df?

Есть ли способ вставить df [1] в качестве внутреннего поля df [0]?

Есть ли способ использовать df [0] .getItem (), поэтому он возвращает всевнутренние поля?

Есть ли более простой способ создания фрейма данных?

Любая помощь будет оценена

Спасибо

1 Ответ

0 голосов
/ 25 ноября 2018

Используйте функцию df split и шаблон регулярных выражений для пробелов ("\\s+").Документы: https://spark.apache.org/docs/2.3.1/api/python/_modules/pyspark/sql/functions.html

def split(str, pattern):
    """
    Splits str around pattern (pattern is a regular expression).

    .. note:: pattern is a string represent the regular expression.

    >>> df = spark.createDataFrame([('ab12cd',)], ['s',])
    >>> df.select(split(df.s, '[0-9]+').alias('s')).collect()
    [Row(s=[u'ab', u'cd'])]
    """
    sc = SparkContext._active_spark_context
    return Column(sc._jvm.functions.split(_to_java_column(str), pattern))

Затем вы можете использовать getItem в массиве col для получения определенного значения поля.

...