Spark Scala数据帧转换

时间:2017-02-01 19:55:19

标签: scala apache-spark dataframe delimiter

我有一个用〜分隔的文本文件,我需要在转换为数据帧之前执行一些解析。代码读入文本文件,因为RDD [String]进行了一些解析。然后,它转换为RDD [Row]。然后使用架构创建数据帧。

以下是我的以下代码。它的工作原理但问题是实际的架构长达400个字段。我想知道是否有一种比输入属性(1),属性(2),属性(3)等更简单的方法。

我目前在Spark 1.6上。 CDH 5.2.2

示例输入:

20161481132310 ~     ~"This" is a comma 10

当前代码:

val schema_1 = StructType(Array(
StructField("EXAMPLE_1", StringType, true),
StructField("EXAMPLE_2", StringType, true),
StructField("EXAMPLE_3", StringType, true)))

val rdd = sc.textFile("example.txt")
val rdd_truncate =  rdd.map(_.split("~").map(_.trim).mkString("~"))
val row_final = rdd_truncate
  .map(_.split("~"))
  .map(attributes => Row(attributes(0),
    attributes(1),
    attributes(2)))

val df = sqlContext.createDataFrame(row_final, schema_1)

根据建议我修改了以下内容。它的工作原理除了引号。 "这"在输入中将失败。有什么建议吗?

val df = sqlContext.read
      .format("com.databricks.spark.csv")
      .option("delimiter","~")
      .schema(schema)
      .load("example.txt")
val df_final = df.select(df.columns.map(c =>trim(col(c)).alias(c)): _*)

1 个答案:

答案 0 :(得分:3)

只需使用标准CSV阅读器:

spark.read.schema(schema).option("delimiter", "~").csv("example.txt")

如果您想修剪字段,只需使用select

import org.apache.spark.sql.functions.{col, trim}

df.select(df.columns.map(c => trim(col(c)).alias(c)): _*)

如果您使用Spark 1.x,则可以使用spark-csv

sqlContext.read
  .format("com.databricks.spark.csv")
  .schema(schema)
  .option("delimiter", "~")
  .load("example.txt")

如果由于某种原因这不够,您可以使用Row.fromSeq

Row.fromSeq(line.split("~").take(3))