大数据产品调研-Oracle

Big Data Architecture

大数据架构

Oracle产品体系

Oracle的Big Data产品体系,总体分为4个领域:

Aggregate

数据整合工具集。

Big Data Preparation

特性:

  1. 数据导入(Ingest)
    • 支持非结构化、半结构化及结构化数据
    • 清洗及规范数据,比如日期及手机号码的规范
    • 能够检查出数据重复
  2. 丰富信息(Enrich)
    • 数值数据的统计分析,文本数据的词频分析
    • 数据的自动分类
    • 元数据的发现(比如判断某列的内容为city)
    • 数据增强(Augment )(比如city列,推荐系统建议将列的人口、省份等额外信息添加到数据集中)
  3. 数据治理(Govern)
    • 导入任务的调度(用户的每一步操作都会记录下来,保存后作为调度任务的批处理脚本)
    • 仪表盘展示数据的历史记录
  4. 直观易用
    • 可视化展示(比如以饼图展示某列的样本分布)
    • 无脚本,全程通过视频及引导
    • 基于机器学习的推荐,提高用户体验(比如建议将列名修改为country)

IoT

物联网

Golden Gate

数据上云
1. 基于change log的数据复制,对原有db无影响
2. 基于socks5代理的TCP/IP连接,安全加密,高性能
3. 方便的界面管理及监控

Data Integrator for Big Data

用于大数据处理的数据集成工具,支持多种大数据平台

  1. ELT的架构,直接在目标平台进行转换、调度等,省去了中间层的开销

  2. 将逻辑模型设计与物理层的实现解耦

  3. 支持Native代码生成,支持Spark、Hive、Pig等多种标准,并可以在多种平台间无缝切换。

Metadata Management

元数据管理

  1. 通过元数据管理确保数据的规范化

  2. 通过增加协作和社交功能来提高管理效率

  3. 通过元数据版本控制,以实现数据一致性

  4. 通过数据血缘及影响分析报告,来管理数据的生命周期

数据治理工具的具体步骤:

  1. 定义业务术语(指标定义)

  2. 识别关键指标(Critial Data Element)

  3. 定义指标的安全等级

  4. 定义业务规则,并将指标与规则关联起来

  5. 定义指标的有效取值

  6. 支持数据血缘和影响分析

    • 能追溯某个指标的来源表
    • 能追溯某个指标的业务规则
    • 能从源头指标追溯到聚集计算后的指标

Oracle Stream Explorer

实时处理平台

Manage

云基础设施及云数据库

Experiment

专注于数据的探索,发掘数据的价值

Big Data Discovery

一种全新的大数据分析方法,有效地帮助组织机构快速地看到和了解原始数据的潜在意义,并且轻松转换数据使其更加直观用以信息发现,然后共享数据带来的新的价值。

  1. Find
    数据浏览、检测

  2. Explore
    可视化展现数据透视的结果

  3. Transform
    提供丰富的转换函数,并能增加维表信息(如地理信息)

  4. Discovery
    数据集的关联,多维分析,多样的可视化展现形式

  5. Share
    可以分享截图、项目等,并可以将数据导出到hdfs上,供后续使用

Analyze and Act

数据挖掘及数据服务,体现数据价值

Data Visualization

数据可视化

Business Intelligence

Advanced Analytics

  1. Oracle R
  2. Oracle Data Mining

Real-Time Decisions

实时决策管理平台

Big Data SQL

可以让用户在Hadoop等NoSQL平台上使用SQL进行查询

Spatial and Graph

图形分析
地理位置信息

ibatis to mybatis.Part 2

在转换的过程中,陆续遇到了几个问题

jdbcType大小写问题

Build.xml
<replace dir="destination" includes="*.xml" token=":NUMERIC#" value=",jdbcType=NUMERIC#" encoding="UTF8"/>
<replace dir="destination" includes="*.xml" token=":TIMESTAMP#" value=",jdbcType=TIMESTAMP#" encoding="UTF8"/>
<replace dir="destination" includes="*.xml" token=":VARCHAR#" value=",jdbcType=VARCHAR#" encoding="UTF8"/>

jdbcType的大小写需要实现转换,另外需要添加更多的类型。

dynamic的转换缺失

默认的migrate.xslt没有对dynamic element做转换,需要新增转换逻辑。

首先确定dynamic element的定义,ibatis.dtd中可以找到

<!--Wrapper tag that allows for an overall prepend, open and close.-->
<!ELEMENT dynamic (#PCDATA | include | iterate | isParameterPresent | isNotParameterPresent | isEmpty | isNotEmpty | isNotNull | isNull | isNotEqual | isEqual | isGreaterThan | isGreaterEqual | isLessThan | isLessEqual | isPropertyAvailable | isNotPropertyAvailable)*>
<!ATTLIST dynamic
prepend CDATA #IMPLIED
open CDATA #IMPLIED
close CDATA #IMPLIED
>

然后将dynamic element的处理逻辑加入到migrate.xslt中。

migrate.xslt
<xsl:template match="dynamic">
    <xsl:element name="trim">
        <xsl:attribute name="prefix">
            <xsl:value-of select="@prepend" />
        </xsl:attribute>
        <xsl:attribute name="prefixOverrides">
            <xsl:text>and|or|,</xsl:text>
        </xsl:attribute>
        <xsl:value-of select="@open" />
        <xsl:apply-templates/>
        <xsl:value-of select="@close" />
    </xsl:element>  
</xsl:template>

效果如下:

ibatis source
<dynamic prepend=" where " close="and (1=1)">
  <isNotNull property="offerId" prepend="and">
    item_id=#offerId#
  </isNotNull>
</dynamic>

mybatis target
<trim prefix=" where " prefixOverrides="and|or|,">
  <if test="offerId != null">and
    item_id=#{offerId}
  </if>
</trim>


isNotEmpty的翻译错误

原先isNotEmpty的转换逻辑为:

<xsl:template match="isNotEmpty">
  <xsl:element name="if">
    <xsl:attribute name="test">
      <xsl:if test="substring-before(@property, '.')">
        <xsl:value-of select="substring-before(@property, '.')" /><xsl:text> != null and </xsl:text>
      </xsl:if>
      <xsl:value-of select="@property" /><xsl:text> != null and </xsl:text>
      <xsl:value-of select="@property" /><xsl:text>.size != 0</xsl:text>
    </xsl:attribute>
    <xsl:value-of select="@prepend" />
      <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

但是当遇到iterate类型时,直接!=”是会报错的。需要针对iterate类型,修改isNotEmpty的逻辑

<xsl:template match="isNotEmpty">
  <xsl:element name="if">
    <xsl:attribute name="test">
      <xsl:if test="substring-before(@property, '.')">
        <xsl:value-of select="substring-before(@property, '.')" /><xsl:text> != null and </xsl:text>
      </xsl:if>
      <xsl:value-of select="@property" /><xsl:text> != null and </xsl:text>
      <xsl:choose>
        <xsl:when test="child::node()[contains(name(), 'iterate')]">
          <xsl:value-of select="@property" /><xsl:text>.size != 0</xsl:text>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="@property" /><xsl:text> != ''</xsl:text>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:attribute>
    <xsl:value-of select="@prepend" />
      <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

最终的转换效果如下:

ibatis source
<isNotEmpty property="offerIds" prepend="and">
  item_id in
  <iterate property="offerIds" conjunction="," open="(" close=")">
    #offerIds[]#
  </iterate>
</isNotEmpty>

mybatis target
<if test="offerIds != null and offerIds.size != 0">and
  item_id in
  <foreach collection="offerIds" item="item" separator="," close=")" open="(">
    #{item}
  </foreach>
</if>

ibatis to mybatis.Part 1

目标

将ibatis的dynamic SQL,翻译为符合mybatis规范的SQL

两者区别

ibatis

官方文档
标签可以嵌套,具体包括以下几种:

  • Binary Conditional Elements
<isEqual prepend="AND"  property="status"  compareValue="Y">
MARRIED = 'TRUE'
</isEqual> 

  • Unary Conditional Elements
<isNotNull prepend="AND" property="order.id" >
  ORDER.ORDER_ID = #order.id#
</isNotEmpty>

  • Parameter Present Elements
<isParameterPresent prepend="AND">
  EMPLOYEE_TYPE = #empType#
</isParameterPresent>

  • Iterate Element
<select id="select-test" resultMap="MyTableResult" parameterClass="list">
select * from my_table where col_1 in
  <iterate open="(" close=")" conjunction=",">
   #[]#
  </iterate>
</select>

  • Simple Dynamic SQL Elements
<statement id="getProduct" resultMap="get-product-result">
  select * from PRODUCT order by $preferredOrder$
</statement>

mybatis

官方文档

  • if
<if test="title != null">
  AND title like #{title}
</if>
<if test="author != null and author.name != null">
  AND author_name like #{author.name}
</if>

  • choose (when, otherwise)
<choose>
  <when test="title != null">
    AND title like #{title}
  </when>
  <when test="author != null and author.name != null">
    AND author_name like #{author.name}
  </when>
  <otherwise>
    AND featured = 1
  </otherwise>
</choose>

  • trim (where, set)
<trim prefix="WHERE" prefixOverrides="AND |OR ">   ... </trim>
  • foreach
<foreach item="item" index="index" collection="list"
    open="(" separator="," close=")">
      #{item}
</foreach>

  • Direct substitution
<select id="selectByNetworkId" parameterType="java.util.Map" resultMap="userResult">
    select user_profile.user_profile_id,  user_profile.first_name
    from user_profile user_profile
    where  user_profile.network_id = #{network_id}  
    order by  user_profile.user_profile.first_name ${sortType}
</select>

方案

  1. 传参格式的转换
    • replace $id$ with ${id}
    • replace #id# with #{id}
    • replace xyz[] with item for use in iterators
  2. Element写法的转换
    • isNull -> object == null OR object.property == null
    • isNotNull -> object != null AND object.property != null
    • isNotEmpty -> object != null AND object.property != null AND object.property != ”
    • isEmpty -> object != null AND (object.property == null OR object.property == ”)
    • isGreaterThan -> property > value (number or another property)
    • isLessThan -> property < value (number or another property)
    • isEqual -> object != null AND object.property == value (number or another property)
    • isLessEqual -> object != null AND object.property <= value (number or another property)
    • iterate
  3. 无法转换的Element
    • dynamic
    • isPropertyAvailable
    • isNotPropertyAvailable
    • isNotParameterPresent
    • isParameterPresent

(to be continued ……)