Scala(IntelliJ+Maven):将数组转为带首元素为表头的DataFrame/RDD
将数组转换为带指定表头的Spark DataFrame/RDD
当然可以实现这个需求!我给你分享两种适配Spark Scala场景的做法,正好符合你在IntelliJ+Maven下的开发环境~
首先前提是你已经初始化了SparkSession(这是Spark SQL操作的基础),代码大概是这样:
import org.apache.spark.sql.SparkSession val spark = SparkSession.builder() .appName("ArrayToDataFrameDemo") .master("local[*]") // 本地开发时用,生产环境请移除该行 .getOrCreate() import spark.implicits._
方法一:直接操作数组生成DataFrame/RDD
这种方式不需要转List,直接处理原始数组即可:
val input = Array("Name, Number", "John, 9070", "Sara, 8041") // 1. 提取并清洗表头:分割字符串后去除每个字段的前后空格 val headers = input(0).split(",").map(_.trim) // 2. 处理数据行:跳过表头行,分割每行并清洗空格 val dataRows = input.drop(1).map(_.split(",").map(_.trim)) // 转成RDD val dataRDD = spark.sparkContext.parallelize(dataRows) // 转成DataFrame:需要先定义Schema,再把数据转成Row类型 import org.apache.spark.sql.types.{StringType, StructField, StructType} val schema = StructType(headers.map(header => StructField(header, StringType, nullable = true))) val dataDF = spark.createDataFrame(dataRDD.map(org.apache.spark.sql.Row.fromSeq(_)), schema) // 查看结果 dataDF.show()
方法二:先转List再处理
如果你更习惯用List操作,逻辑和上面基本一致,只是先把数组转成List:
val inputList = input.toList // 提取表头 val headersList = inputList.head.split(",").map(_.trim) // 提取数据行 val dataRowsList = inputList.tail.map(_.split(",").map(_.trim)) // 转RDD val dataRDDFromList = spark.sparkContext.parallelize(dataRowsList) // 转DataFrame,复用上面定义的schema即可 val dataDFFromList = spark.createDataFrame(dataRDDFromList.map(org.apache.spark.sql.Row.fromSeq(_)), schema) dataDFFromList.show()
额外注意事项
- 如果你的
Number字段是数值类型(比如整数),可以修改Schema里的类型为IntegerType,同时把数据行的对应字段转成整数:val dataRows = input.drop(1).map(row => { val arr = row.split(",").map(_.trim) Array(arr(0), arr(1).toInt) }) - 如果你的数据行里包含带逗号的字段(比如
"Doe, John, 9070"),直接用split(",")会出错,这时候建议用Spark的CSV解析器来处理 - 生产环境部署时,一定要去掉
master("local[*]"),让Spark使用集群的配置
内容的提问来源于stack exchange,提问作者Foxlooo
相关产品推荐
相关产品推荐

