Dataframe 是否可以获取单个数据帧行并将其拆分为多个数据帧行?
我是pySpark的新手,我正在尝试使用电表间隔数据集csv中的一些电表数据 我有一个从电表数据的CSV导入创建的dataframe架构,看起来像这样:Dataframe 是否可以获取单个数据帧行并将其拆分为多个数据帧行?,dataframe,apache-spark,pyspark,split,Dataframe,Apache Spark,Pyspark,Split,我是pySpark的新手,我正在尝试使用电表间隔数据集csv中的一些电表数据 我有一个从电表数据的CSV导入创建的dataframe架构,看起来像这样: root |-- _c0: string (nullable = true) |-- _c1: integer (nullable = true) |-- _c2: string (nullable = true) |-- _c3: string (nullable = true) |-- _c4: integer (nullable
root
|-- _c0: string (nullable = true)
|-- _c1: integer (nullable = true)
|-- _c2: string (nullable = true)
|-- _c3: string (nullable = true)
|-- _c4: integer (nullable = true)
|-- _c5: string (nullable = true)
|-- _c6: long (nullable = true)
|-- _c7: string (nullable = true)
|-- _c8: string (nullable = true)
|-- _c9: string (nullable = true)
|-- _c10: string (nullable = true)
|-- _c11: double (nullable = true)
|-- _c12: integer (nullable = true)
|-- _c13: integer (nullable = true)
|-- _c14: long (nullable = true)
|-- _c15: string (nullable = true)
|-- _c16: double (nullable = true)
|-- _c17: long (nullable = true)
|-- _c18: string (nullable = true)
|-- _c19: double (nullable = true)
|-- _c20: long (nullable = true)
|-- _c21: string (nullable = true)
|-- _c22: double (nullable = true)
|-- _c23: long (nullable = true)
|-- _c24: string (nullable = true)
|-- _c25: double (nullable = true)
|-- _c26: long (nullable = true)
|-- _c27: string (nullable = true)
|-- _c28: double (nullable = true)
...
_c13包含一个数字,指示其后有多少3个数据列的分组。在每个记录上表示时间戳、标志和值的值从1到96不等
(i.e. timestamp, flag, value)
_c14, _c15, _c16 = Group 1 (202010101315, "NONE", 1.1)
_c17, _c18, _c19 = Group 2 (202010101330, "NONE", 1.2)
_c20, _c21, _c22 = Group 3 (202010101345, "EST", 0.75) etc...
我认为我想要的AWS红移表的最终输出是源数据帧中每个分组的一行
_c0到_c12将与每个分组一起输出
+-----+----+ +------+-------------+------+-------+
_c0 _c1 ... | _c12 | timestamp | flag | value |
+-----+----+ +------+-------------+------+-------+
A B ... L 202010101315 NONE 1.1
A B ... L 202010101330 NONE 1.2
A B ... L 202010101345 EST 0.75
etc...
到目前为止,我已经成功地将数据加载到数据帧中。为了迭代每一行,我意识到我可以使用自定义函数创建一个RDD来对该行执行操作:
rdd = df.rdd.map(customFunction)
但我很快意识到,我只能向RDD返回一个分组
然后,我研究了在customFunction中向新的dataframe追加一行,但是在了解到dataframe是不可变的,并且每次追加都会返回一个新的dataframe之后,我意识到这可能没有那么有效
任何关于基本结构的帮助,以实现我所寻找的记录的有效分割,我们将不胜感激 基本上,您正在寻找explode函数,该函数允许从一行中的数组创建多行。您还需要从所需的列创建该数组 但是,我不知道在sparkSQL中有什么方法可以创建一个列数可变的数组,其大小由另一列参数化。在RDD中,您可以轻松地使用flatMap完成此操作。在SparkSQL中,我们可以做的是创建一个包含所有可能列的数组,然后过滤那些您不需要的列 假设dataframe的列列表以要保留的列开始,然后是包含组数的列(在本例中为c13),然后是包含组的列。在pyspark中,代码可能如下所示:
root
|-- _c0: string (nullable = true)
|-- _c1: integer (nullable = true)
|-- _c2: string (nullable = true)
|-- _c3: string (nullable = true)
|-- _c4: integer (nullable = true)
|-- _c5: string (nullable = true)
|-- _c6: long (nullable = true)
|-- _c7: string (nullable = true)
|-- _c8: string (nullable = true)
|-- _c9: string (nullable = true)
|-- _c10: string (nullable = true)
|-- _c11: double (nullable = true)
|-- _c12: integer (nullable = true)
|-- _c13: integer (nullable = true)
|-- _c14: long (nullable = true)
|-- _c15: string (nullable = true)
|-- _c16: double (nullable = true)
|-- _c17: long (nullable = true)
|-- _c18: string (nullable = true)
|-- _c19: double (nullable = true)
|-- _c20: long (nullable = true)
|-- _c21: string (nullable = true)
|-- _c22: double (nullable = true)
|-- _c23: long (nullable = true)
|-- _c24: string (nullable = true)
|-- _c25: double (nullable = true)
|-- _c26: long (nullable = true)
|-- _c27: string (nullable = true)
|-- _c28: double (nullable = true)
...
包含组数的列的索引
组_列=13
最大组数,96,如果我理解正确的话
最大组数=96
df\
.使用列组,
F.阵列[
F.struct
F.col_c+strgroup_列+1+3*i.alias时间戳,
F.col_c+strgroup_列+2+3*i.aliasflag,
F.col_c+strgroup_列+3+3*i.aliasvalue,
F.liti.alias索引
对于范围内的i最大组数
]
\
.放下*[
_范围组列+1中i的c+stri,组列+3*最大组列数+1
]\
.带列,F.带组\
其中F.col\u c+strgroup\u column>F.cols.index\
.在rangegroup_列+1中为i选择[F.col_c+stri]+[s.]\
.dropindex
代码的详细说明:
“组”列就是我所说的数组。它包含所有可能的组,每个组都包含在索引范围从0到最大组数的结构中。然后我删除组列以避免它们爆炸。然后我分解数组,每个组创建一行。然后,where命令使用我们添加到结构中的索引和列_c13中的组数除去您不想要的组。最后,我们把所有的东西都放在正确的形状上:选择我们想要保留在列前面的列,并使用通配符*。我来试一试,谢谢你的详细解释!你能解决你的问题吗?