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
Java 将索引列添加到现有Spark';s数据帧_Java_Apache Spark - Fatal编程技术网

Java 将索引列添加到现有Spark';s数据帧

Java 将索引列添加到现有Spark';s数据帧,java,apache-spark,Java,Apache Spark,我使用Spark 1.5操作,使用Java。我需要将ID/索引列附加到现有数据帧,例如: +---------+--------+ | surname| name| +---------+--------+ | Green| Jake| | Anderson| Thomas| | Corleone| Michael| | Marsh| Randy| | Montana| Tony| | Green| Julia| |Brenneman| E

我使用Spark 1.5操作,使用Java。我需要将ID/索引列附加到现有数据帧,例如:

+---------+--------+
|  surname|    name|
+---------+--------+
|    Green|    Jake|
| Anderson|  Thomas|
| Corleone| Michael|
|    Marsh|   Randy|
|  Montana|    Tony|
|    Green|   Julia|
|Brenneman|    Eady|
|   Durden|   Tyler|
| Corleone|    Vito|
|   Madiro|     Mat|
+---------+--------+
我希望每一行都附加索引,范围在1和表记录数量之间。索引顺序无关紧要,任何行都必须只包含唯一的ID/索引。它可以通过转换为RDD并附加索引行和转换为具有修改的StructType的DataFrame来完成,但是,如果我理解正确的话,此操作会为转换等消耗大量资源,必须有另一种方法。 结果必须如下所示:

+---------+--------+---+
|  surname|    name| id|
+---------+--------+---+
|    Green|    Jake|  3|
| Anderson|  Thomas|  5|
| Corleone| Michael|  2|
|    Marsh|   Randy| 10|
|  Montana|    Tony|  7|
|    Green|   Julia|  1|
|Brenneman|    Eady|  2|
|   Durden|   Tyler|  9|
| Corleone|    Vito|  4|
|   Madiro|     Mat|  6|
+---------+--------+---+

谢谢。

您可以使用withColumn函数。用法应该类似于Val myDF=existingDF.withColumn(“index”),express(random(1,existingDF.count())

伙计们,这是一种很好的方法:


模拟RDD中的ZipWithIndex方法…第一个建议性能更好,但与纯Dataframes解决方案相比没有什么大不了的(在我的场景中,表中有100多行)。

在Scala中,首先我们需要创建一个索引数组:

val indx_arr=(1 to your_df.count.toInt).toArray

indx_arr: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
现在,我们想将此列附加到数据帧。 首先,我们打开数据帧并将其作为一个数组,然后使用
indx_arr
压缩它,然后将新创建的数组转换回and RDD。最后一步是将其作为一个数据帧:

final_df = sc.parallelize((your_df.collect.map(
    x=>(x(0),x(1))) zip indx_arr).map(
    x=>(x._1._1.toString,x._1._2.toString,x._2))).toDF("surname","name","id")

这也是一种将任何类型的数组附加到Spark数据帧的简单而直接的方法。

在Spark数据帧中执行此操作的最简洁方法:

.withColumn("idx",monotonically_increasing_id())

完整的文档:

我知道这个问题可能是很久以前的事了,但您可以按如下方式解决:

from pyspark.sql.window import Window  
w = Window.orderBy("myColumn") 
withIndexDF = originalDF.withColumn("index", row_number().over(w))
  • myColumn:数据帧中的任何特定列
  • originalDF:没有索引列的原始数据帧

他提出的第一个解决方案可能重复(如果我正确理解Scala语法)第二,我不能在Java中调用这个函数,它生成的唯一值不是所需的范围,因此唯一可能的解决方案是使用哈希函数,但它有不可接受的缺点。实际上,我的观点是,根据您的需求,没有比RDD->zipWithIndex更好的解决方案。也不包括Python代码片段那里的每一段代码都应该是Java兼容的。什么是
express
?Expr来表达问题:>我希望每一行都附加索引,范围在1和表记录数量之间。从
的代码中单调递增\u id()
:>生成的ID保证是单调递增且唯一的,但不是连续的。当使用window With partition子句时,会出现所有数据落入单个分区的警告,这可能会导致性能严重下降。