检查数据大小spark数据帧

时间:2018-07-12 13:33:54

标签: scala apache-spark

我有以下问题: 实际上,我正在使用以下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

2 个答案:

答案 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 |
+----------+-------+

要计算尺寸,您可以使用withColumnlength函数并根据需要播放。

data.withColumn("jobSize", length($"job"))
  .withColumn("martialSize", length($"marital"))
  .show(false)

输出:

+----------+-------+-------+-----------+
|job       |marital|jobSize|martialSize|
+----------+-------+-------+-----------+
|management|married|10     |7          |
|technician|single |10     |6          |
+----------+-------+-------+-----------+

所有列类型均为String

希望这会有所帮助!