zhangnew

认真你就赢了

太长不看版:Spark 3.2 之后为了兼容 ANSI SQL 标准,修改了 Interval 的数据类型(CalendarIntervalType → YearMonthIntervalType),代码中只写了 String → CalendarIntervalType的隐式转换规则,这里新版需要配置 spark.sql.legacy.interval.enabled=true 来让 Interval 使用旧的数据类型(CalendarIntervalType)。

问题描述

最近将项目从 Spark 2.4 升级到 Spark 3.2.2 之后发现一个 SQL 报错:

1
2
3
4
scala> spark.sql("select '2022-11-12 23:33:55' - INTERVAL 3 YEAR")
org.apache.spark.sql.AnalysisException: cannot resolve '(CAST('2022-11-12 23:33:55' AS DOUBLE) - INTERVAL '3' YEAR)' due to data type mismatch: differing types in '(CAST('2022-11-12 23:33:55' AS DOUBLE) - INTERVAL '3' YEAR)' (double and interval year).; line 1 pos 7;
'Project [unresolvedalias((cast(2022-11-12 23:33:55 as double) - INTERVAL '3' YEAR), None)]
+- OneRowRelation

而在 Spark 2.4 中可以正常执行:

1
2
3
4
5
6
scala> spark.sql("select '2022-11-12 23:33:55' - INTERVAL 3 YEAR").show
+-------------------------------------------------------------------------+
|CAST(CAST(2022-11-12 23:33:55 AS TIMESTAMP) - interval 3 years AS STRING)|
+-------------------------------------------------------------------------+
| 2019-11-12 23:33:55|
+-------------------------------------------------------------------------+

这里可以看到,Spark 2.4 中 StringInterval 类型做运算时,自动将 String 类型转为了 Timestamp 类型,而在 Spark 3.2 中却把 String 类型转为了 Double 类型,导致计算报错。

阅读全文 »

根据 Spark 官方文档,表名是大小写不敏感的,大写会自动转小写:

An identifier is a string used to identify a database object such as a table, view, schema, column, etc. Spark SQL has regular identifiers and delimited identifiers, which are enclosed within backticks. Both regular identifiers and delimited identifiers are case-insensitive.

问题描述

Spark 1.4 之后新增了字段名大小写敏感的开关,经测试,开启之后会导致一些问题;

cannot resolve ‘Tb.xx’ given input columns

开启大小写敏感 spark.sql.caseSensitive=true

如果表名包含大写字母,比如 Tb1 然后执行 select Tb1.xx 就会报错,因为 Tb1 表名会被转为 tb1,Spark 的元数据中只有 tb1.xx 字段。

(以下代码除特别说明,均使用 Spark 3.3.2 版本进行测试,Hive 存储元数据,HDFS 存储数据)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# spark-shell --conf spark.sql.caseSensitive=true

scala> spark.sql("SELECT * FROM VALUES (1) AS (`id`)").write.saveAsTable("Tb1")

// 实际存储的表名是 tb1,数据在 hdfs 上的目录是 Tb1
scala> spark.sql("show tables").show
+---------+------------+-----------+
|namespace| tableName|isTemporary|
+---------+------------+-----------+
| default| tb1| false|
+----------------------------------+

// 修改 select 部分使用 Tb1 会报错,逻辑计划最下面可以看到 spark 将表名转为了小写
// 也就是说 Tb1.id != tb1.id 导致报错 找不到字段
scala> spark.sql("select Tb1.id from Tb1").explain(true)
org.apache.spark.sql.AnalysisException: Column 'Tb1.id' does not exist. Did you mean one of the following? [spark_catalog.default.tb1.id]; line 1 pos 7;
'Project ['Tb1.id]
+- SubqueryAlias spark_catalog.default.tb1
+- Relation default.tb1[id#32] parquet

// 在 Spark 3.2.2 版本中报错信息如下
scala> spark.sql("select Tb1.id from Tb1").show(false)
org.apache.spark.sql.AnalysisException: cannot resolve 'Tb1.id' given input columns: [spark_catalog.default.tb1.id]; line 1 pos 7;
'Project ['Tb1.id]
+- SubqueryAlias spark_catalog.default.tb1
+- Relation default.tb1[id#24] parquet
阅读全文 »

之前很长一段时间都是使用 Isso 作为评论系统,最近发现了一个 Valine 的替代品:Waline,更加符合需求,花了一个周末迁移了一下,写了个脚本,记录一下。

先说下 Waline 的特性,也是比较吸引我的点:

  • 支持 Markdown、表情、公式
  • 支持内容校验、防灌水
  • 允许匿名、也支持登录
  • 可以完全自托管独立部署
  • 支持浏览量统计
  • 多种通知方式
阅读全文 »

数据湖定义

数据湖是一类存储数据自然/原始格式的系统或存储,通常是对象块或者文件。数据湖通常是企业中全量数据的单一存储。全量数据包括原始系统所产生的原始数据拷贝以及为了各类任务而产生的转换数据,各类任务包括报表、可视化、高级分析和机器学习。数据湖中包括来自于关系型数据库中的结构化数据(行和列)、半结构化数据(如CSV、日志、XML、JSON)、非结构化数据(如email、文档、PDF等)和二进制数据(如图像、音频、视频)。

数据湖是个架构概念,一种架构设计的理念,不是一种特定的实施方法,更不是一款特定产品。

数据沼泽是一种退化的、缺乏管理的数据湖,数据沼泽对于用户来说要么是不可访问的、要么就是无法提供足够的价值。

与数据仓库的对比

特性 数据仓库(WareHouse) 数据湖(Data Lake) 湖仓一体?(Lake House)
数据 来自事务系统、运营数据库和业务线应用程序的关系数据 来自 IoT 设备、网站、移动应用程序、社交媒体和企业应用程序的非关系和关系数据
Schema 设计在数据仓库实施之前(写入型 Schema) 写入在分析时(读取型 Schema)
性价比 更快查询结果会带来较高存储成本 更快查询结果只需较低存储成本
数据质量 可作为重要事实依据的高度监管数据 任何可以或无法进行监管的数据(例如原始数据,可避免信息丢失)
关注点 充分设计的数据模型 对原始数据的高效、灵活处理
用户 业务分析师 数据科学家、数据开发人员和业务分析师(使用监管数据)
分析 批处理报告、BI 和可视化 机器学习、预测分析、数据发现和分析
阅读全文 »

记一次 Greenplum 集群宕机恢复流程,网上相关资料比较少,主要问题是非正常关闭集群,导致 segment 的 xlog 损坏,最后通过pg_resetxlog 修复 xlog 之后,修改 Greenplum 系统表 gp_segment_configuration 来重置 segment 状态。

阅读全文 »

(本文写于 2017 年初,更新于 2022 年)
博客评论系统现状:

  • 多说已经倒闭了,将于 2017.6.31 结束服务
  • Disqus 国内非常不稳定,虽然用了一段时间,但是发现最近好像有广告了,有很多乱七八糟的请求。
  • 畅言估计和多说差不了多少,没看到赢利点。
  • 网易云跟帖,不能设置昵称,不能匿名评论,加了官方群,都是提问的,管理员不作为。
  • 然后就找到了这个开源的评论系统:Isso

2022-05-22 更新:本站评论系统替换为 Waline,详见:从 Isso 迁移到 Waline

2020-03-22 更新:最近又看了下新版本(源码安装),有了很多新特性

  • 支持邮件通知,每个评论都发给管理员,评论者可以接收别人回复自己的评论;
  • 支持 Gravatar 头像显示(支持使用CDN镜像,你懂的),或者随机头像;
  • 支持 MarkDown;
  • 后台审核管理功能;
  • 对评论进行<顶>/<踩>;
  • Python 3

2017-05-01 更新:新增微信审核评论的方法,见:微信审核开源评论系统 Isso 的评论

阅读全文 »

Coding 在卖给腾讯之后又表面上独立了,不再集成在腾讯云里面,改版之后开始使用 e.coding.net 域名,从单纯的 git 服务变成了项目管理,默认是以团队形式做项目管理,一个人也是创建团队之后再用,5 人一下团队免费。团队下面可以创建多个项目,每个项目可以有多个 git 仓库。新增功能包括:持续集成、文档管理、项目管理(待办等)、测试管理(用例、评审等)、项目统计等。

Coding Pages 服务免费了,需要实名认证(身份证号码和手机号即可),不过因为某些原因,服务器在国外,速度还可以,支持自定义域名、https 和 h2,折腾一天之后成功实现 push 之后自动编译 hexo 并部署到 Coding Pages,不用腾讯的小鸡部署了。

主要说一下 Jenkins 配置和自动部署:

阅读全文 »