如何使用Scala在Spark中对行类型的RDD进行拆分

如何使用Scala在Spark中对行类型的RDD进行拆分,scala,apache-spark,Scala,Apache Spark,我在HDFS上有一个文件json,我读过: var data = sqlContext.read.json("/.....") 下面是它的模式: |-- @timestamp: string (nullable = true) |-- beat: struct (nullable = true) | |-- hostname: string (nullable = true) | |-- name: string (nullable = true) | |-- ve

我在HDFS上有一个文件
json
,我读过:

var data = sqlContext.read.json("/.....")
下面是它的模式:

 |-- @timestamp: string (nullable = true)
 |-- beat: struct (nullable = true)
 |    |-- hostname: string (nullable = true)
 |    |-- name: string (nullable = true)
 |    |-- version: string (nullable = true)
 |-- fields: struct (nullable = true)
 |    |-- env: string (nullable = true)
 |    |-- env2: string (nullable = true)
 |    |-- env3: struct (nullable = true)
 |    |    |-- format: string (nullable = true)
 |    |    |-- name: string (nullable = true)
 |    |    |-- version: double (nullable = true)
 |-- input_type: string (nullable = true)
 |-- text: string (nullable = true)
我想拆分字段
文本
,我尝试了:

var myRDD = data.select("text").rdd

var split_myRDD = myRDD.map(ligne => ligne.split("|"))
它不起作用:错误:值拆分不是org.apache.spark.sql.Row的成员


有人能告诉我哪里出了故障吗?

你不需要为此转换为RDD。您可以在DF中使用split函数。代码如下所示

df.select("text")
  .withColumn("text_split", split(col("text"), "\\|"))

如果有特殊需要,还可以使用RDD,并使用“\\\\\”分割文本。我希望它能有所帮助。

当您阅读JSON时,生成的对象是一个数据帧。将数据帧转换为RDD时,将有一个[Row]数组。Row类描述数据帧中的一行,并具有与数据帧相同的模式。要能够从行中提取元素,应执行以下操作:

myRDD
  .map(row => row.getString(row.fieldIndex("text")).split("|"))

myRDD
属于
RDD[Row]
类型。应用
.split()
时,需要从
中获取实际值。使用
var split\u myRDD=myRDD.map(ligne=>ligne.getAs[String](0).split(“|”)
它可以工作,但它只显示两个字段:value和in-field元素?我找不到所有其余的字段。你说其余的字段是什么意思?当我打印Schemayes时,它显示:root |--value:array(nullable=true)|--element:string(containsnall=true),但是你需要什么?从原始json输入中分离的值以及剩余的列?