我正在使用spark 2.3
我有这样的DataFrame(在其他情况下_c0可能包含20个内部字段):
1.1 1.2 4.55 | a
4.44 3.1 9.99 | b
1.2 99.88 10.1 | x
我想拆分c0,并像这样创建新的DataFrame:
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(),所以它返回所有内部字段?
有没有更简单的方法来生成数据框架?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
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来获取特定的字段值。