Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.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

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中将单行拆分为多行_Java_Apache Spark_Rows_Transpose - Fatal编程技术网

如何在Java Spark中将单行拆分为多行

如何在Java Spark中将单行拆分为多行,java,apache-spark,rows,transpose,Java,Apache Spark,Rows,Transpose,我有一个Spark数据框,看起来像这样: id var_a var_b -- ----- ----- 01 1 2 02 3 0 我想像这样把值分成多行 id var_name var_value -- -------- --------- 01 var_a 1 01 var_b 2 02 var_a 3 02 var_b 0 使用Java Spark 1.6 API的最佳方法是什么?flatMap是您正在寻找的函数 它允许

我有一个Spark数据框,看起来像这样:

id  var_a var_b
--  ----- -----
01  1     2
02  3     0
我想像这样把值分成多行

id  var_name var_value
--  -------- ---------
01  var_a    1  
01  var_b    2
02  var_a    3
02  var_b    0  

使用Java Spark 1.6 API的最佳方法是什么?

flatMap
是您正在寻找的函数


它允许从一条记录生成多条记录。

一个新的FlatMap函数完成了这项工作:

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.RowFactory;

/**
 * id  var_a var_b
 * --  ----- -----
 * 01  1     2
 * 02  3     0
 *
 * becomes
 * 
 * id  var_name var_value
 * --  -------- ---------
 * 01  var_a    1  
 * 01  var_b    2
 * 02  var_a    3
 * 02  var_b    0 
 *
 */
public class OneToManyMapFunction implements FlatMapFunction<Row, Row> {

    //indexes of fields that won't change in the new rows (id)
    private int[] fixedFields = {0};
    //indexes of fields that will create new rows (var_a, var_b)
    private int[] dynamicFields = {1, 2};
    //names of the dynamic fields
    private String[] dynamicFieldsName = {"var_a", "var_b"};

    public OneToManyMapFunction() {}

    @Override
    public Iterable<Row> call(Row row) throws Exception {

        List<Row> rows = new ArrayList<Row>();
        Object[] fixedValues = ArrayUtils.EMPTY_OBJECT_ARRAY;

        //add values that won't change in the new rows
        for (int i = 0; i < fixedFields.length; i++) {
            fixedValues = ArrayUtils.add(fixedValues, row.get(fixedFields[i]));
        }

        //create new rows
        for (int i = 0; i < dynamicFields.length; i++) {
            //copy fixed values (id)
            Object[] values = ArrayUtils.clone(fixedValues);

            //add dynamic value name (var_a or var_b)
            values = ArrayUtils.add(values, dynamicFieldsName[i]);
            //add dynamic value
            values = ArrayUtils.add(values, row.get(dynamicFields[i]));

            //create new row for dynamic val
            Row newRow = RowFactory.create(values);
            rows.add(newRow);
        }

        return rows;
    }

}
import java.util.ArrayList;
导入java.util.List;
导入org.apache.commons.lang3.ArrayUtils;
导入org.apache.spark.sql.Row;
导入org.apache.spark.sql.RowFactory;
/**
*id变量a变量b
* --  ----- -----
* 01  1     2
* 02  3     0
*
*变成
* 
*id变量名称变量值
* --  -------- ---------
*01 var_a 1
*01 var_b 2
*02 var_a 3
*02变量b 0
*
*/
公共类OneToManyMapFunction实现FlatMapFunction{
//新行中不会更改的字段索引(id)
私有int[]fixedFields={0};
//将创建新行的字段索引(变量a、变量b)
私有int[]dynamicFields={1,2};
//动态字段的名称
私有字符串[]dynamicFieldName={“var_a”,“var_b”};
公共OneToManyMapFunction(){}
@凌驾
公共Iterable调用(行)引发异常{
列表行=新建ArrayList();
Object[]fixedValues=ArrayUtils.EMPTY\u Object\u数组;
//在新行中添加不会更改的值
for(int i=0;i
还可以看看函数。好的,但哪个函数才是正确的映射函数?新函数()?查看
flatMap
的签名:它需要一个
flatMap函数
:因此,您需要一个
新函数