spark导入csv文件,其中string数据类型为'NULL'字符串,解决方案!

  • 创建导入数据的外部表
create EXTERNAL table cyf_ce(
  attr1 STRING ,
  attr2 STRING ,
  attr3 STRING ,
  attr4 STRING ,
  attr5 STRING ,
  channel_account STRING ,
  channel_type STRING ,
  device STRING ,
  employee STRING ,
  inbound INT ,
  field_location STRING ,
  referrer STRING ,
  referrer_name STRING ,
  tag STRING ,
  target_id STRING ,
  target_name STRING ,
  campaign STRING ,
  campaign_name STRING ,
  content_name STRING ,
  source STRING ,
  summary STRING ,
  internal_content_id STRING ,
  last_forwarder STRING ,
  score INT ,
  last_updated BIGINT ,
  ref_score INT ,
  page_id STRING ,
  event_group STRING ,
  batch_id STRING ,
  from_collector INT ,
  app_name STRING ,
  app_version STRING ,
  quantity1 BIGINT ,
  quantity2 BIGINT ,
  amount1 DOUBLE ,
  amount2 DOUBLE ,
  identity_value STRING ,
  identity_type STRING ,
  identity_value2 STRING ,
  identity_type2 STRING ,
  identity_value3 STRING ,
  identity_type3 STRING ,
  is_first_try INT ,
  is_first_engage INT ,
  duration INT ,
  utma STRING ,
  utm STRING ,
  quantity3 BIGINT ,
  date1 BIGINT ,
  date2 BIGINT
### 使用 Spark 进行数据清洗的方法和示例教程 #### 安装与环境准备 为了能够顺利运行Spark程序,需先完成Spark的安装并设置好相应的开发环境。这通常涉及下载适合版本的Spark以及配置必要的依赖库[^1]。 #### 创建SparkSession对象 在开始编写任何转换操作之前,创建一个`SparkSession`实例是非常重要的一步。这是进入所有功能的主要入口点。 ```scala val spark = SparkSession.builder() .appName("Data Cleaning Example") .config("spark.some.config.option", "some-value") .getOrCreate() ``` #### 加载原始数据集 通过读取CSV文件来加载待清理的数据源。这里假设有一个名为`dirty_data.csv`的文件作为输入。 ```scala val df = spark.read.format("csv").option("header","true").load("path/to/dirty_data.csv") df.show() // 显示前几条记录以便查看结构 ``` #### 处理缺失 对于存在NULL或空白字段的情况,可以采用删除含有这些异常情况的整行或者填充默认得方式处理。 ```scala // 删除包含null的所有列 val cleanedDfNoNulls = df.na.drop() // 或者用0替换所有的null型字段;对于字符串类型的字段可以用"unknown" import org.apache.spark.sql.functions._ val filledDF = df.fill(0).withColumn("string_column", when(col("string_column").isNull, lit("unknown")).otherwise(col("string_column"))) filledDF.show() ``` #### 去重 去除重复项可以通过调用distinct方法实现,也可以基于某些特定的关键字组合去重。 ```scala // 移除完全相同的行 val distinctDF = df.distinct() // 根据指定的一组键移除重复行 val uniqueByKeyDF = df.dropDuplicates(Array("key_column")) uniqueByKeyDF.show() ``` #### 转换日期间格式 如果遇到不一致的间戳表示形式,则应统一其表达方式以方便后续计算。 ```scala import java.text.SimpleDateFormat import org.apache.spark.sql.Row import org.apache.spark.sql.types._ def parseDate(dateStr:String):String={ val formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") try { val dateObj = formatter.parse(dateStr) formatter.format(dateObj) } catch { case e:Exception => null } } val parsedDatesRDD = df.rdd.map(row=>Row(parseDate(row.getString(0)), row.toSeq.tail:_*)) val schemaWithParsedDates = StructType(df.schema.fields.updated(0,StructField("date_col", StringType))) val finalCleanedDataFrame = spark.createDataFrame(parsedDatesRDD,schemaWithParsedDates) finalCleanedDataFrame.show() ``` 以上就是利用Apache Spark来进行简单而有效的数据预处理过程中的几个典型步骤介绍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值