Skip to content

Commit 5a44ec3

Browse files
author
xiaohei
committed
update: 优化Row到Pojo的转换过程
1 parent 94ebc14 commit 5a44ec3

2 files changed

Lines changed: 16 additions & 12 deletions

File tree

bigdata-base-framework/src/main/scala/org/aisql/bigdata/base/framework/util/DataFrameReflactUtil.scala

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,20 @@ object DataFrameReflactUtil {
127127
}
128128
}
129129

130+
def generatePojoValue(clazz: Class[_], row: Row): Any = {
131+
val bean = clazz.newInstance()
132+
val fields = getUsefulFields(clazz).map(f => (f.getName, f)).toMap
133+
row.schema.foreach {
134+
s =>
135+
fields.get(s.name).foreach {
136+
f =>
137+
f.setAccessible(true)
138+
f.set(bean, row.get(row.fieldIndex(s.name)))
139+
}
140+
}
141+
bean
142+
}
143+
130144
/**
131145
* 根据 java.lang.reflect.Type 获取 org.apache.spark.sql.types.DataType
132146
* 递归处理嵌套类型
@@ -195,7 +209,7 @@ object DataFrameReflactUtil {
195209
* 根据Class类型获取可用的成员变量(可被转换为DataType类型)
196210
* Class类型中所有的成员变量将会逐一尝试转换为DataType
197211
**/
198-
def getUsefulFields(clazz: Class[_]): Array[Field] = {
212+
private def getUsefulFields(clazz: Class[_]): Array[Field] = {
199213
classFieldsCache.getOrElseUpdate(clazz, {
200214
val fields = ReflactUtil.getFields(clazz)
201215
fields.filter(f => switchDataType(f.getGenericType).nonEmpty)

bigdata-base-framework/src/main/scala/org/aisql/bigdata/base/gojira/monster/sparkimpl/SparkHiveDaor.scala

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -77,17 +77,7 @@ class SparkHiveDaor(basePackage: String, whoami: String) extends Ancestor {
7777
| override protected def transDf2Rdd(df: DataFrame)(implicit env: SparkSession): RDD[$beanClsName] = {
7878
| df.rdd.map {
7979
| row =>
80-
| val bean = new $beanClsName
81-
| val fields = DataFrameReflactUtil.getUsefulFields(classOf[$beanClsName]).map(f => (f.getName, f)).toMap
82-
| row.schema.foreach {
83-
| s =>
84-
| fields.get(s.name).foreach {
85-
| f =>
86-
| f.setAccessible(true)
87-
| f.set(bean, row.get(row.fieldIndex(s.name)))
88-
| }
89-
| }
90-
| bean
80+
| DataFrameReflactUtil.generatePojoValue(classOf[$beanClsName], row).asInstanceOf[$beanClsName]
9181
| }
9282
| }
9383
""".stripMargin

0 commit comments

Comments
 (0)