scala中是否有办法从父类中获取当前子类的参数

scala中是否有办法从父类中获取当前子类的参数,第1张

从题目描述来看,题主真正想问的是“在Scala中能否在父类中获取子类的构造参数”,用反射肯定是能办到的,代码如下:

trait Base{

def getSubclassArgs = {

import scala.reflect.runtime.{universe =>ru}

val mirror = ru.runtimeMirror(getClass.getClassLoader)

val currentType = mirror.classSymbol(getClass).toType

val instanceMirror = mirror.reflect(this)

val constructor = currentType.decl(ru.termNames.CONSTRUCTOR).asMethod

val constructorParamsName = constructor.paramLists.flatten.map(_.name.toString)

val terms = constructorParamsName.map(name =>currentType.decl(ru.TermName(name)))

val args = terms.map(term =>instanceMirror.reflectField(term.asTerm).get)

args

}

}

class Impl(val args: String) extends Base{}

执行结果如下:

scala>val foo = new Impl("get subclass args!")

foo: Impl = Impl@5f0bf0ed

scala>foo.getSubclassArgs

res2: List[Any] = List(get subclass args!)

这里有一点不那么舒服的地方是Impl的构造参数必须加上val或者var,否则会获取不到。

必须使用高亮参数启Spark-shell,否则遍历RDD现Exception

java.io.NotSerializableException: org.apache.hadoop.hbase.io.ImmutableBytesWritable

spark-shell--conf spark.serializer=org.apache.spark.serializer.KryoSerializer

代码,经MaprDB实测通

import org.apache.spark._

import org.apache.spark.rdd.NewHadoopRDD

import org.apache.hadoop.hbase.{HBaseConfiguration, HTableDescriptor}

import org.apache.hadoop.hbase.client.HBaseAdmin

import org.apache.hadoop.hbase.mapreduce.TableInputFormat

import org.apache.hadoop.fs.Path

import org.apache.hadoop.hbase.HColumnDescriptor

import org.apache.hadoop.hbase.util.Bytes

import org.apache.hadoop.hbase.client.Put

import org.apache.hadoop.hbase.client.HTable

val tableName = "/app/SubscriptionBillingPlatform/TRANSAC_ID"

val conf = HBaseConfiguration.create()

conf.set(TableInputFormat.INPUT_TABLE, tableName)

//create rdd

val hBaseRDD = sc.newAPIHadoopRDD(conf, classOf[TableInputFormat],

classOf[org.apache.hadoop.hbase.io.ImmutableBytesWritable],

classOf[org.apache.hadoop.hbase.client.Result])

hBaseRDD.take(2).map(row=>row._2.rawCells).

map(_.map( kv =>(new String(kv.getQualifier()) ->new

String(kv.getValue()) ) ).toMap ). foreach( map =>{ map.foreach{

entry =>print(entry._1 +":" + entry._2 + ", ") }

print("\n-----------\n") } )

//get the row count

val count = hBaseRDD.count()

print("HBase RDD count:"+count)

变量是程序的基本组成单位

var|val 变量名 [: 变量类型] = 变量值

整形

scala整数类型有固定的表数范围和字面长度,不受OS影响

scala的整数默认为整形,如果想表示Long,后面加L

浮点型

不受OS影响

scala浮点型常数默认为Double,声明float后面要加F

浮点型有两种表示方式十进制型和科学计数型(0.12,0.12f,.12,5.12e2=5.12乘以10的2次方)

字符类型

常量用双引号(" ")括起来

允许使用转义符

直接给Char整数,会输出码表对应的字符

Char可以进行运算,字符都有对应的数值

存储:字符->码值->二进制->存储

读取:二进制->码值->字符->读取

布尔类型

只允许取值true和false

只占1个字节

适用于逻辑运算

Unit

只有1个实例null,可以赋值给任意的引用类型,但是不能赋值给值类型(Int等)

函数没有返回值

Nothing

方法不会正确返回

值类型隐式转换

高级隐式转换和隐式函数

强制类型转换

自动类型转换的逆过程

将容量大的数据类型转换成容量小的数据类型,使用时要加上强制转换函数,但 可能造成精度降低或溢出 ,要格外注意

强制符号只针对最近的 *** 作数有效,使用括号提升优先级

Char类型可以保存Int常量值,但不能保存Int变量值,需要强转

Byte和Short在运算时当作Int来处理

值类型和字符串类型的转换

基本类型转string + ""

string转基本数据类型 .toInt, .toDouble, ……

12.5转Int 报错!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12098226.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存