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
Apache spark 在java中,使用withColumn在映射中查找字段值将列添加到数据帧_Apache Spark - Fatal编程技术网

Apache spark 在java中,使用withColumn在映射中查找字段值将列添加到数据帧

Apache spark 在java中,使用withColumn在映射中查找字段值将列添加到数据帧,apache-spark,Apache Spark,在Java中,我想向dataframe添加一个列,该列的值使用列中的值在映射中查找,如下所示 .withColumn(“lookup”,lit(size.value().floorEntry(col(“integer”)).getValue()) 但这导致了一个例外 Caused by: java.lang.ClassCastException: org.apache.spark.sql.Column cannot be cast to java.lang.Comparable

在Java中,我想向dataframe添加一个列,该列的值使用列中的值在映射中查找,如下所示

.withColumn(“lookup”,lit(size.value().floorEntry(col(“integer”)).getValue())
但这导致了一个例外

Caused by: java.lang.ClassCastException: org.apache.spark.sql.Column cannot be cast to java.lang.Comparable
        at java.util.TreeMap.compare(TreeMap.java:1290)
如果我对键使用固定值,则查找工作正常

.withColumn(“lookup”,lit(size.value().floorEntry(28.getValue()))
我正在尝试的是可能的吗

请注意,该地图是一个“NavigableMap”,用于获取最接近的匹配项,并且已经进行了广播

带有问题行的代码被注释掉了

最终广播size=spark.sparkContext()
.广播(
新的NavigableMapBuilder()
.put(138000)
.put(166905)
.put(27,1894)
.put(292107)
.get(),
类标记(NavigableMap.class)
);
最终数据集extract=spark.createDataFrame(
asList(
创建(“C000001573”,新日期(119,8,13),13),
创建(“C000001573”,新日期(119,8,14),16),
创建(“C000001573”,新日期(119,8,15),27),
创建(“C000001573”,新日期(119,8,16),29)
) ,
DataTypes.createStructType(
新结构域[]{
DataTypes.createStructField(“key”,DataTypes.StringType,false),
DataTypes.createStructField(“日期”,DataTypes.DateType,false),
DataTypes.createStructField(“整数”,DataTypes.IntegerType,false)
}
)
);
摘录
.带列(“乘”,列(“整数”)。乘(10))
//.withColumn(“lookup”,lit(size.value().floorEntry(col(“integer”)).getValue())
.withColumn(“lookup”,lit(size.value().floorEntry(28.getValue()))
.带列(“副本”,列(“日期”))
.show();

公共类NavigableMapBuilder{
private final NavigableMap map=新树映射();
公共NavigableMapBuilder放置(K键,V值){
this.map.put(键、值);
归还这个;
}
公共导航地图获取(){
返回此.map;
}
}
它生成了这个输出

+----------+----------+-------+--------+------+----------+
|       key|      date|integer|multiply|lookup|     extra|
+----------+----------+-------+--------+------+----------+
|C000001573|2019-09-13|     13|     130|  1894|2019-09-13|
|C000001573|2019-09-14|     16|     160|  1894|2019-09-14|
|C000001573|2019-09-15|     27|     270|  1894|2019-09-15|
|C000001573|2019-09-16|     29|     290|  1894|2019-09-16|
+----------+----------+-------+--------+------+----------+


一种方法是使用用户定义的函数:为此,我引用了ApacheSpark的Action版本2 MEAP

功能

import org.apache.spark.broadcast.broadcast;
导入org.apache.spark.sql.api.java.UDF1;
导入java.util.NavigableMap;
公共类SizeLookup实现UDF1{
私人最终广播大小;
公共尺码表(广播尺码){
这个。尺寸=尺寸;
}
@凌驾
公共整数调用(整数键){
返回(整数)size.value().floorEntry(key.getValue();
}
}
代码示例已更新以使用它

最终广播size=spark.sparkContext()
.广播(
新的NavigableMapBuilder()
.put(138000)
.put(166905)
.put(27,1894)
.put(292107)
.get(),
类标记(NavigableMap.class)
);
spark.udf().register(“lookupSize”、新的SizeLookup(size)、DataTypes.IntegerType);
最终数据集extract=spark.createDataFrame(
asList(
创建(“C000001573”,新日期(119,8,13),13),
创建(“C000001573”,新日期(119,8,14),14),
创建(“C000001573”,新日期(119,8,15),27),
创建(“C000001573”,新日期(119,8,16),29)
) ,
DataTypes.createStructType(
新结构域[]{
DataTypes.createStructField(“key”,DataTypes.StringType,false),
DataTypes.createStructField(“日期”,DataTypes.DateType,false),
DataTypes.createStructField(“整数”,DataTypes.IntegerType,false)
}
)
);
摘录
.带列(“乘”,列(“整数”)。乘(10))
.withColumn(“lookup”,callUDF(“lookupSize”,col(“integer”))
.带列(“副本”,列(“日期”))
.show();
这很容易实现。显然,它也可以用在spark sql中,但我还没有尝试过