我有一个用〜分隔的文本文件,我需要在转换为数据帧之前执行一些解析。代码读入文本文件,因为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)): _*)
答案 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))