Browse Source

修改逻辑

xueyiming 2 weeks ago
parent
commit
b88bbccbae

+ 33 - 7
src/main/scala/com/aliyun/odps/spark/examples/makedata_ad/v20240718/makedata_ad_33_addFeatureToHive_20250708.scala

@@ -94,17 +94,43 @@ object makedata_ad_33_addFeatureToHive_20250708 {
       throw new IllegalArgumentException("表中不存在 'mid' 字段,请检查字段名")
     }
 
-    val mid = Option(record.getString(midIndex))
-      .getOrElse("")
+    // 4. 处理 mid 字段(支持非字符串类型转换为字符串)
+    val midColumn = columns(midIndex)
+    val midType = midColumn.getTypeInfo.getTypeName // 获取 mid 字段类型
+    val midValue: Any = midType match {
+      case "STRING" => record.getString(midIndex)
+      case "BIGINT" => record.getBigint(midIndex)  // 长整型
+      case "DOUBLE" => record.getDouble(midIndex)  // 浮点型
+      case "BOOLEAN" => record.getBoolean(midIndex) // 布尔型
+    }
+    val mid = Option(midValue).map(_.toString).getOrElse("") // 转换为字符串,null 转为空字符串
 
+    // 5. 处理所有字段(非字符串类型转为字符串)
     val recordMap = columns.zipWithIndex
       .map { case (column, index) =>
-        // 获取字段值,保留 null(不转换为空字符串)
-        val value: String = record.getString(index) match {
-          case null => null // 保留 null 值
-          case value => value // 非 null 值转换为字符串
+        val columnName = column.getName
+        val columnType = column.getTypeInfo.getTypeName // 获取字段类型
+
+        // 根据字段类型获取值并转换为字符串
+        val value: String = columnType match {
+          case "STRING" =>
+            val str = record.getString(index)
+            if (str == null) null else str // 字符串类型直接保留(null 保持 null)
+
+          case "BIGINT" =>
+            val num = record.getBigint(index)
+            if (num == null) null else num.toString // 长整型转字符串
+
+          case "DOUBLE" =>
+            val num = record.getDouble(index)
+            if (num == null) null else num.toString // 浮点型转字符串
+
+          case "BOOLEAN" =>
+            val bool = record.getBoolean(index)
+            if (bool == null) null else bool.toString // 布尔型转字符串("true"/"false")
         }
-        column.getName -> value
+
+        columnName -> value
       }
       .toMap