开发者社区> 问答> 正文

拆分spark DataFrame列

我正在使用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(),所以它返回所有内部字段?

有没有更简单的方法来生成数据框架?

展开
收起
社区小助手 2018-12-06 15:42:40 2661 0
1 条回答
写回答
取消 提交回答
  • 社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

    plit对空格("\s+")使用df 函数和正则表达式模式。文档: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来获取特定的字段值。

    2019-07-17 23:18:35
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Hybrid Cloud and Apache Spark 立即下载
Scalable Deep Learning on Spark 立即下载
Comparison of Spark SQL with Hive 立即下载