我有以下问题: 实际上,我正在使用以下csv文件:
""job"";""marital"""
""management"";""married"""
""technician"";""single"""
我将其加载到spark数据框中,如下所示: 我的目的是按照以下设置规则检查数据框中每个字段的长度和类型:
col type
job char10
marital char7
我开始执行对每个字段长度的检查,但是出现编译错误:
val data = spark.read.option("inferSchema", "true").option("header", "true").csv("file:////home/user/Desktop/user/file.csv")
data.map(line => {
val fields = line.toString.split(";")
fields(0).size
fields(1).size
})
预期输出应为: 清单(10,10)
关于类型的检查,我不知道如何实现,因为我们正在使用数据帧。关于验证数据格式的函数有什么想法?
非常感谢您的答复。
ata
答案 0 :(得分:0)
您正在使用数据框。因此,当您使用map方法时,您将在lambda中处理Row。
所以行是行。
Row.toString将返回一个表示行的字符串,因此在您的情况下,将2个structfields键入为String。
如果要使用地图并处理“行”,则必须手动获取字段内的vlaue。使用getAsString和getAsString。
通常,在使用数据框时,必须使用select,where ...或直接使用SQL语法来像SQL中那样处理列的逻辑。
答案 1 :(得分:0)
我看到您正在尝试使用Dataframe
,但是如果有多个双引号,那么您可以将其读为textFile
并将其删除并转换为Dataframe
,如下所示
import org.apache.spark.sql.functions._
import spark.implicits._
val raw = spark.read.textFile("path to file ")
.map(_.replaceAll("\"", ""))
val header = raw.first
val data = raw.filter(row => row != header)
.map { r => val x = r.split(";"); (x(0), x(1)) }
.toDF(header.split(";"): _ *)
您得到data.show(false)
+----------+-------+
|job |marital|
+----------+-------+
|management|married|
|technician|single |
+----------+-------+
要计算尺寸,您可以使用withColumn
和length
函数并根据需要播放。
data.withColumn("jobSize", length($"job"))
.withColumn("martialSize", length($"marital"))
.show(false)
输出:
+----------+-------+-------+-----------+
|job |marital|jobSize|martialSize|
+----------+-------+-------+-----------+
|management|married|10 |7 |
|technician|single |10 |6 |
+----------+-------+-------+-----------+
所有列类型均为String
。
希望这会有所帮助!