拆分Spark DataFrame列

时间:2018-11-25 10:11:26

标签: apache-spark dataframe pyspark rdd

我正在使用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 :(得分:0)

对空白(split)使用df "\\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))

然后可以在数组col上使用getItem来获取特定的字段值。