因此,我正在尝试将带有类型猪映射的数据导入到火花数据框架中,而我找不到有关如何将映射数据爆炸到3列中的任何内容名字:街,城市和州。我可能正在寻找错误的事情。现在,我可以使用structType和structField选项将它们导入3列。
val schema = StructType(Array(
StructField("id", IntegerType, true),
StructField("name", StringType, true),
StructField("address", StringType, true))) #this is the part that I need to explode
val data = sqlContext.read.format("com.databricks.spark.csv")
.option("header", "false")
.option("delimiter", ";")
.schema(schema)
.load("hdfs://localhost:8020/filename")
我需要从:
中制作5列的数据行328;Some Name;[street#streetname,city#Chicago,state#IL]
我需要做什么才能将地图爆炸到3列中,以便ID基本上具有5列的新数据框架?我刚开始火花,我从未使用过猪。我只发现这是通过搜索结构[键#值]的猪图。
我正在使用Scala使用Spark 1.6。谢谢您的帮助。
我对猪的格式不太熟悉(甚至可能有库),但是一些出色的时装弦乐操纵似乎有效。实际上,您可能必须进行一些错误检查,否则您将获得索引之外的范围错误。
val data = spark.createDataset(Seq(
(328, "Some Name", "[street#streetname,city#Chicago,state#IL]")
)).toDF("id", "name", "address")
data.as[(Long, String, String)].map(r => {
val addr = (r._3.substring(1, r._3.length - 1)).split(",")
val street = addr(0).split("#")(1)
val city = addr(1).split("#")(1)
val state = addr(2).split("#")(1)
(r._1, r._2, street, city, state)
}).toDF("id", "name", "street", "city", "state").show()
导致
+---+---------+----------+-------+-----+
| id| name| street| city|state|
+---+---------+----------+-------+-----+
|328|Some Name|streetname|Chicago| IL|
+---+---------+----------+-------+-----+
但是,我不是100%与Spark 1.6的兼容性。您最终可能需要映射Dataframe
(与.as[]
调用相反,而不是Dataset
),然后从匿名.map()
函数中的Row
对象中提取单个值。整体概念应该相同。