Scala中将List[Array[String]]转换为15列DataFrame的方法
解决方法
方法一:直接用Spark内置CSV读取器(推荐)
Spark原生支持从HTTP URL读取CSV,无需手动处理IO流和第三方CSVReader,还能自动拆分列,代码更简洁高效:
val spark: SparkSession = SparkSession.builder.master("local").getOrCreate import spark.implicits._ try { val url = "someurlimreadingfrom.com/asdf" // 根据CSV实际格式调整参数:比如是否有表头、分隔符等 val df = spark.read .option("header", "false") // 无表头设为false,有表头则设为true .option("sep", ",") // 分隔符默认逗号,按需修改 .csv(url) df.show() } catch { case e: Exception => e.printStackTrace() }
Spark会自动将每行的15个字段拆分为15列,默认列名为_c0至_c14;若CSV带表头,设置header=true后会自动用表头作为列名。
方法二:基于现有List[Array[String]]拆分列
如果要保留当前的读取逻辑,可通过以下两种方式拆分数组列:
var stockURL: URL = null val spark: SparkSession = SparkSession.builder.master("local").getOrCreate import spark.implicits._ val sc = spark.sparkContext try { stockURL = new URL("someurlimreadingfrom.com/asdf") val in: BufferedReader = new BufferedReader(new InputStreamReader(stockURL.openStream)) val reader: CSVReader = new CSVReader(in) val allRows: List[Array[String]] = reader.readAll.asScala.toList // 方式1:转成Tuple15后生成DataFrame,自定义列名 val allRowsDF = sc.parallelize(allRows) .map(arr => (arr(0), arr(1), arr(2), arr(3), arr(4), arr(5), arr(6), arr(7), arr(8), arr(9), arr(10), arr(11), arr(12), arr(13), arr(14))) .toDF("col0", "col1", "col2", "col3", "col4", "col5", "col6", "col7", "col8", "col9", "col10", "col11", "col12", "col13", "col14") // 方式2:从数组列中逐个提取元素生成新列 // val tempDF = sc.parallelize(allRows).toDF("value") // val allRowsDF = tempDF.select( // (0 to 14).map(i => col("value")(i).alias(s"col$i")): _* // ) allRowsDF.show() } catch { case e: MalformedURLException => e.printStackTrace() case e: IOException => e.printStackTrace() }
两种方式注意事项:
- 方式1要求所有数组长度必须为15,否则会抛出索引越界异常,适合数据格式固定的场景。
- 方式2通过遍历索引提取元素,灵活性更高,同样需保证所有数组长度一致。
内容的提问来源于stack exchange,提问作者alexstrasza
相关产品推荐
相关产品推荐

