我正在使用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(),因此它返回所有内部字段?
是否有一种更简单的方法来生成数据帧?
任何帮助将不胜感激
谢谢
答案 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
来获取特定的字段值。