Apache spark spark scala中具有两种不同模式的筛选器列

Apache spark spark scala中具有两种不同模式的筛选器列,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我有三列的dataframe;ID、CO_ID和DATA,其中数据列具有以下两种不同的模式: |ID |CO_ID |Data |130 |NA | [{"NUMBER":"AW9F","ADDRESS":"PLOT NO. 230, JAIPUR RJ","PHONE":999999999,"NAME":"SACHIN"}] |536 |NA | [{"NUMBER":"AW9F","ADDRESS":"PLOT NO. 230, JAIPUR RJ","PHONE":99999

我有三列的dataframe;ID、CO_ID和DATA,其中数据列具有以下两种不同的模式:

|ID  |CO_ID |Data
|130 |NA    | [{"NUMBER":"AW9F","ADDRESS":"PLOT NO. 230, JAIPUR RJ","PHONE":999999999,"NAME":"SACHIN"}]
|536 |NA    | [{"NUMBER":"AW9F","ADDRESS":"PLOT NO. 230, JAIPUR RJ","PHONE":999999999,"NAME":"SACHIN"}]   
|518 |NA    | null
|938 |611   | {"NUMBER":"AW9F","ADDRESS":"PLOT NO. 230, JAIPUR RJ","PHONE":999999999,"NAME":"SACHIN"}                                                                                                                           
|742 |NA    | {"NUMBER":"AW9F","ADDRESS":"PLOT NO. 230, JAIPUR RJ","PHONE":999999999,"NAME":"SACHIN"}
现在我想创建一个包含列ID、CO_ID、NUMBER、ADDRESS和NAME的数据框架。如果没有值,则在数字、地址和名称中填写null值

首先,我必须用不同的模式过滤上面的数据帧,我如何才能做到这一点?

这里有一种方法:

val df=Seq(
(130,“不适用”,“编号:”AW9F,“地址:”斋浦尔RJ 231号地块,“电话”:99999999,“姓名:”SACHIN“}]”,
(536,“NA”和“[{“编号”:“AW9F”,“地址”:“斋浦尔RJ 232号地块”,“电话”:9999999,“名称”:“SACHIN”}])”,
(518,“不适用”,无效),
(938,“611”,“编号:”{“AW9F”,“地址:”“斋浦尔RJ 233号地块”,“电话:”:99999999,“姓名:”:“SACHIN”}“),
(742,“NA”,“编号:”{“AW9F”,“地址:”“斋浦尔RJ 234号地块”,“电话:”:99999999,“名称:”:“SACHIN”}“))
.toDF(“ID”、“CO_ID”、“数据”)
导入org.apache.spark.sql.types.StructType
导入org.apache.spark.sql.functions.{from_json,array,when,length,lit}
val架构=(新结构类型)
.add(“数字”、“字符串”、true)
.add(“地址”、“字符串”、true)
.add(“电话”,“字符串”,真)
.add(“名称”、“字符串”、true)
val df_ar=df.withColumn(“json”,
何时($“数据”
.startsWith(“[{”)&&&&$数据“.endsWith(“}]”),$“数据”.substr(lit(2),长度($“数据”)-2))
。否则($“data”)//检查数据是否以“[{”开头并以“}]”结尾,如果它确实删除了[]
.withColumn(“json”,来自_json($“json”,schema))//基于给定的schema转换为json
.withColumn(“number”,$“json.number”)
.withColumn(“地址“,$”json.address”)
.withColumn(“name”,$“json.name”)
df_ar.选择(“ID”、“CO_ID”、“编号”、“地址”、“名称”)。显示(假)
此解决方案首先从JSON字符串中删除
[]
,然后应用给定的模式将字符串JSON转换为StructType列

输出:

+---+-----+------+-----------------------+------+
|ID |CO_ID|number|address                |name  |
+---+-----+------+-----------------------+------+
|130|NA   |AW9F  |PLOT NO. 231, JAIPUR RJ|SACHIN|
|536|NA   |AW9F  |PLOT NO. 232, JAIPUR RJ|SACHIN|
|518|NA   |null  |null                   |null  |
|938|611  |AW9F  |PLOT NO. 233, JAIPUR RJ|SACHIN|
|742|NA   |AW9F  |PLOT NO. 234, JAIPUR RJ|SACHIN|
+---+-----+------+-----------------------+------+

数据列的类型是什么?看起来有些行是数组,有些不是。是的,这只是问题所在,我有不同类型的数据,所以如何处理这种问题?Spark不允许不同类型的数据。执行
df.printSchema()
的结果是什么?看,我有一个csv文件,其中有这样的数据,现在我必须创建一个带有上面解释的列的表。有什么办法吗?模式显示如下根|--ID:string(nullable=true)|--CO_ID:string(nullable=true)|--data:string(nullable=true)谢谢Alex,但是我可以不使用schema吗?您好@Mohammad,我相信如果没有schema,您必须直接处理字符串,这将非常复杂。如果我不想使用schema,那么我如何直接处理字符串,它将如何复杂?您能给我讲一点吗?例如,您可以通过提取带有正则表达式和自定义项的值。虽然这肯定会慢得多,并且会影响性能。那么,模式有什么问题呢?您没有问题中所示的特定模式?实际上,在数据列中,可能有很多键,有时是5键或4键或更少或更多。