每年的9月20日,是全国爱牙日。作为中国特有的节日,爱牙日的由来主要与兰州地区的牙科医生--白成平有关。白成平在17岁的时候,就跟随美国口腔医学博士毛燮均学习牙医技术。此后,他便一直在兰州一家医院担任牙科医生。在50多年的牙医生涯中,他对人
全部3个回答 >spark可以定义方法吗
-
spark可以定义包括new类,uadf类,mongodb类,scala类的方法。
有时候看到 new 类().{方法定义}.方法 这种怪异的代码,是匿名内部类的用法。
public class practice {
public static void main(String[] args) {
flatMap(new FlatMapFunction() {
@Override
public void call() {
System.out.println("spark接口就是这么调用的");
}
});
}
static void flatMap(FlatMapFunction tf) {
tf.call();
}
}
interface FlatMapFunction {
void call();
}
要使用接口,就必须实现接口的方法再调用方法。
匿名内部类语法,允许我们不需要单独定义接口,而是在main方法中来实现这个过程。这使得接口实现的修改像if和for一样随意了,比如spark中的一些接口的重载方法。
所谓“内部”是指在方法内调用,”匿名”是指没有给接口的实现类具体命名。
再看看spark的java版本算子,就是用到了匿名内部类,对于没有接触过匿名内部类的人,一定搞得云里雾里。
public class FlatMapOperator {
public static void main(String[] args){
SparkConf conf = new SparkConf().setMaster("local").setAppName("flatmap");
JavaSparkContext sc = new JavaSparkContext(conf);
List<String> list = Arrays.asList("w1 1","w2 2","w3 3","w4 4");
JavaRDD<String> listRdd = sc.parallelize(list);
JavaRDD<String> result = listRdd.flatMap(new FlatMapFunction<String, String>() {
@Override
public Iterator<String> call(String s) throws Exception {
return Arrays.asList(s.split(" ")).iterator();
}
});
result.foreach(new VoidFunction<String>() {
@Override
public void call(String s) throws Exception {
System.err.println(s);
}
});
}
}
FlatMapFunction是内部匿名类的声明,<String, String> 是接口的模板,call是重载的接口方法。
object SparkUDAFDemo {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder().master("local[*]").appName("UDAF").getOrCreate()
import spark.implicits._
val df: DataFrame = spark.read.json("in/user.json")
//创建并注册自定义UDAF函数
val function = new MyAgeAvgFunction
spark.udf.register("myAvgAge",function)
//创建视图
df.createTempView("userinfo")
//查询男女平均年龄
val df2: DataFrame = spark.sql("select sex,myAvgAge(age) from userinfo group by sex")
df2.show()
}
}
//实现UDAF类
//实现的功能是对传入的数值进行累加,并且计数传入的个数,最后相除得到平均数
class MyAgeAvgFunction extends UserDefinedAggregateFunction{
//聚合函数的输入数据结构
override def inputSchema: StructType = {
new StructType().add(StructField("age",LongType))
}
//缓存区数据结构
override def bufferSchema: StructType = {
new StructType().add(StructField("sum",LongType)).add(StructField("count",LongType))
}
//聚合函数返回值数据结构
override def dataType: DataType = DoubleType
//聚合函数是否是幂等的,即相同输入是否能得到相同输出
override def deterministic: Boolean = true
//设定默认值
override def initialize(buffer: MutableAggregationBuffer): Unit = {
//sum
buffer(0)=0L
//count
buffer(1)=0L
}
//给聚合函数传入一条新数据时所需要进行的操作
override def update(buffer: MutableAggregationBuffer, input: Row): Unit = {
//将传入的数据进行累加
buffer(0)=buffer.getLong(0)+input.getLong(0)
//每传入一次计数加一
buffer(1)=buffer.getLong(1)+1
}
//合并聚合函数的缓冲区(不同分区)
override def merge(buffer1: MutableAggregationBuffer, buffer2: Row): Unit = {
//不同分区的数据进行累加
buffer1(0)=buffer1.getLong(0)+buffer2.getLong(0)
buffer1(1)=buffer1.getLong(1)+buffer2.getLong(1)
}
//计算最终结果
override def evaluate(buffer: Row): Any = {
//将sum/count的得到平均数
buffer.getLong(0).toDouble/buffer.getLong(1)
}
}。
2023-10-23 20:20:33 -
Spark是一个开放源代码的分布式计算框架,是基于Java编程语言实现的。在Spark中,可以通过定义函数来实现方法的定义。函数定义的格式与Java中的方法定义类似,可以指定函数的名称、参数列表和返回值类型。通过函数的定义,可以在Spark中实现各种数据处理和计算任务。Spark提供了丰富的API,包括RDD、DataFrame和Dataset等,可以灵活地实现不同的数据处理需求。因此,通过定义函数,可以更好地利用Spark的强大功能和灵活性,实现高效的数据处理和计算。
2023-10-23 20:20:33 -
spark可以定义包括new类,uadf类,mongodb类,scala类的方法。
有时候看到 new 类().{方法定义}.方法 这种怪异的代码,是匿名内部类的用法。
public class practice {
public static void main(String[] args) {
flatMap(new FlatMapFunction() {
@Override
public void call() {
System.out.println("spark接口就是这么调用的");
}
});
}
static void flatMap(FlatMapFunction tf) {
tf.call();
}
}
interface FlatMapFunction {
void call();
}
要使用接口,就必须实现接口的方法再调用方法。
匿名内部类语法,允许我们不需要单独定义接口,而是在main方法中来实现这个过程。这使得接口实现的修改像if和for一样随意了,比如spark中的一些接口的重载方法。
所谓“内部”是指在方法内调用,”匿名”是指没有给接口的实现类具体命名。
再看看spark的java版本算子,就是用到了匿名内部类,对于没有接触过匿名内部类的人,一定搞得云里雾里。
public class FlatMapOperator {
public static void main(String[] args){
SparkConf conf = new SparkConf().setMaster("local").setAppName("flatmap");
JavaSparkContext sc = new JavaSparkContext(conf);
List<String> list = Arrays.asList("w1 1","w2 2","w3 3","w4 4");
JavaRDD<String> listRdd = sc.parallelize(list);
JavaRDD<String> result = listRdd.flatMap(new FlatMapFunction<String, String>() {
@Override
public Iterator<String> call(String s) throws Exception {
return Arrays.asList(s.split(" ")).iterator();
}
});
result.foreach(new VoidFunction<String>() {
@Override
public void call(String s) throws Exception {
System.err.println(s);
}
});
}
}
FlatMapFunction是内部匿名类的声明,<String, String> 是接口的模板,call是重载的接口方法。
object SparkUDAFDemo {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder().master("local[*]").appName("UDAF").getOrCreate()
import spark.implicits._
val df: DataFrame = spark.read.json("in/user.json")
//创建并注册自定义UDAF函数
val function = new MyAgeAvgFunction
spark.udf.register("myAvgAge",function)
//创建视图
df.createTempView("userinfo")
//查询男女平均年龄
val df2: DataFrame = spark.sql("select sex,myAvgAge(age) from userinfo group by sex")
df2.show()
}
}
//实现UDAF类
//实现的功能是对传入的数值进行累加,并且计数传入的个数,最后相除得到平均数
class MyAgeAvgFunction extends UserDefinedAggregateFunction{
//聚合函数的输入数据结构
override def inputSchema: StructType = {
new StructType().add(StructField("age",LongType))
}
//缓存区数据结构
override def bufferSchema: StructType = {
new StructType().add(StructField("sum",LongType)).add(StructField("count",LongType))
}
//聚合函数返回值数据结构
override def dataType: DataType = DoubleType
//聚合函数是否是幂等的,即相同输入是否能得到相同输出
override def deterministic: Boolean = true
//设定默认值
override def initialize(buffer: MutableAggregationBuffer): Unit = {
//sum
buffer(0)=0L
//count
buffer(1)=0L
}
//给聚合函数传入一条新数据时所需要进行的操作
override def update(buffer: MutableAggregationBuffer, input: Row): Unit = {
//将传入的数据进行累加
buffer(0)=buffer.getLong(0)+input.getLong(0)
//每传入一次计数加一
buffer(1)=buffer.getLong(1)+1
}
//合并聚合函数的缓冲区(不同分区)
override def merge(buffer1: MutableAggregationBuffer, buffer2: Row): Unit = {
//不同分区的数据进行累加
buffer1(0)=buffer1.getLong(0)+buffer2.getLong(0)
buffer1(1)=buffer1.getLong(1)+buffer2.getLong(1)
}
//计算最终结果
override def evaluate(buffer: Row): Any = {
//将sum/count的得到平均数
buffer.getLong(0).toDouble/buffer.getLong(1)
}
}。
2023-10-23 20:20:33
-
问 爱牙日的由来答
-
问 爱尔兰是哪个国家答
爱尔兰被称为翡翠岛国,这里西临大西洋、东靠爱尔兰海,与英国隔海相望。爱尔兰其实是一个独立的西欧国家,为北美通向欧洲的通道。爱尔兰、英格兰、苏格兰、威尔士是四个民族,也是四个地方。在历史上,这四个地方分分合合,瓜葛不断。1918年前,四个民族
全部10个回答 > -
问 圣城是哪个城市答
希腊雅典、中国洛阳、沙特麦加和以色列耶路撒冷被世界公认为世界四大圣城。关于洛阳圣城称号的由来,可追溯至上古时期。 相传上古时期,洛阳孟津县境内的黄河中出现背着“河图”的龙马和背着“洛书”的神龟,它们把图和书献给了伏羲后,伏羲根据图和书
全部10个回答 > -
问 芥菜的营养价值答
食材简介: 芥菜又称盖菜、挂菜,是中国的特产蔬菜。芥菜植株一般可高150厘米,幼茎及叶具有毛刺。经过长期选择和栽培,芥菜出现了不同的变种:根芥菜,也叫大头菜,主要用来腌制咸菜;叶芥菜俗称雪里红,可制成霉干菜;茎芥菜,用来制作榨菜;芽芥
全部10个回答 > -
问 猪肝的营养价值答
食材简介: 猪肝又名血肝,是猪的肝脏,与胆相连,肝脏是动物体内储存养料和解毒的重要器官。猪肝在消化系统中能够制造胆汁,一般呈紫红色、红褐色,质软而脆,呈楔形,右端圆钝,左端扁薄,可分为上、下两面,前后两缘,左右两叶。 营养功效:
全部10个回答 > -
问 花椒的营养价值答
食材简介: 花椒,又叫麻椒、蜀椒、点椒等,是我国原产的一种干、枝、叶、果均具浓郁辛香的落叶灌木或小乔木。它最初野生于我国中西部,是作为是敬神的香物。现在广泛分布于我国南北各地。由于它的果皮暗红,密生粒状突出的腺点,犹如细斑,故花椒之名
全部10个回答 > -
问 银鱼的功效与作用答
食材简介: 银鱼,又称炮仗鱼、面条鱼、白饭鱼等,通体白色,整体长约10厘米,刺少,有牙并且十分锋利。银鱼具有海洋至江河洄游的习性,多生活于水的下层,我国的太湖、西湖、马湖是三大银鱼盛产湖。 营养功效: 银鱼所含营养十分丰富,具有高
全部10个回答 > -
答
大理是悠闲和浪漫的代名词,下关的风,上关的花,苍山的雪,洱海的月,“风花雪月”构成了大理最著名的特色。去大理,我们的路线是先游览大理古城周边及崇圣寺三塔,然后环洱海游,最后以登苍山结束。大理古城是大理旅游的核心区,这里承载着大理历史文化、宗
全部10个回答 > -
问 原单和正品的区别答
现在的市场可以说是乌烟瘴气,光各种产品的头衔都搞的人一头雾水,那么,原单和正品有什么区别呢?所谓的原单货和“真货”的唯一区别,不过是“庶出”而已,数量很少。众所周知,现在国外60%以上的奢侈品都在中国生产。国外的一些大品牌会在国内找一些代工
全部10个回答 > -
问 太湖的简介答
“太湖美呀太湖美,美就美在太湖水”,1978年,这首《太湖美》传遍大江南北,太湖一时成为了大家都心中的向往之地。太湖位于江苏省南部,长江三角洲南部,是中国著名的五大淡水湖之一。太湖湖泊面积2427.8平方公里,湖岸线全长393.2公里。其西
全部10个回答 >