Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dataframe 是否可以获取单个数据帧行并将其拆分为多个数据帧行?_Dataframe_Apache Spark_Pyspark_Split - Fatal编程技术网

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

我是pySpark的新手,我正在尝试使用电表间隔数据集csv中的一些电表数据

我有一个从电表数据的CSV导入创建的dataframe架构,看起来像这样:

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中的组数除去您不想要的组。最后,我们把所有的东西都放在正确的形状上:选择我们想要保留在列前面的列,并使用通配符*。我来试一试,谢谢你的详细解释!你能解决你的问题吗?