• [技术干货] 大数据可视化安全保障之受控访问:可传递信任的智能授权链
    数据利用,安全先行。大数据可视化应用,在保证安全的情况下更要管控用户访问数据内容及数据授权。用户机密数据应用可以实行本地私有化部署平台,让数据不出网。即使线上SaaS云服务,在HTTPS数据安全传输的基础上有完整的安全保障体系:1、私密访问:仅在项目白名单中的用户才能访问该项目发布的页面,并且能指定用户访问数据范围。2、受控访问:通过评论@某人时,授权此用户拥有对此页面的访问权限。可对某个已经访问过的用户拉入黑名单禁止访问。3、完全公开访问:即所有注册用户能通过页面分享二维码访问,可对某个已经访问过的用户拉入黑名单禁止访问。4、免登录访问:即直接使用短链接网址地址访问页面,无需用户注册或登录。平台对项目设置受控访问,实现在工作圈或朋友圈最简单、高效和安全的数据可视化访问控制管理,也可让不同人群用户的查看数据范围不同,保障数据安全的同时又能开展高效的数据信息进行传播和互动。大数据可视化应用,迪赛智慧数可视化互动平台为您保驾护航。
  • [问题求助] 【AppCube产品】【AI数据可视化大屏功能】,默认的组件的AppCube APi的桥接器,只能输入URL,怎么增加请求URL
    【功能模块】AI数据可视化大屏功能【操作步骤&问题现象】1、 在进行大屏开发的时候,默认的组件的AppCube APi的桥接器,只能输入URL,怎么增加请求URL里面的HTTP方法,Query参数,请求Body呢2、AppCube API 输入能否自动下拉选择,不是人工拷贝URL【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [基础知识] 【MindSpore易点通】机器学习系列:如何实现降维?
    一周未见,,甚是想念!今天小Mi带大家学习如何降维,这是我们遇到的第二种类型的无监督学习问题!废话不多说,我们开始吧~1 降维示例首先,什么是降维呢?这个问题应该最先搞清楚,由于数据集通常有许多特征,我们可以举一个简单的例子来分析:假设有未知两个的特征:长度,用厘米表示;是用英寸表示同一物体的长度。而特征和都是基本的长度度量,其实只需要有一个特征表示就可以了,因此我们可以将数据减少到一维。虽然可能是采用两种不同的仪器来测量一些东西的尺寸,其中一个仪器测量结果的单位是英寸,另一个仪器测量的结果是厘米,但是将两者都作为特征确实有些重复。而在上图中是一个关于研究直升飞机自动驾驶的实例,如果做一个针对不同飞行员的调查,特征表示飞行员的技能,表示飞行员的爱好,也许这两个特征高度相关,而我们真正关心的可能是图中红线的方向,这个时候就可以将二维数据降为一维数据,如下图所示。当然我们还可以将数据从三维降至二维:将三维向量投射到一个二维的平面上,使得所有的数据都在同一个平面上,降至二维的特征向量,如下图所示。类似于上述的处理过程可以被用于把任何维度的数据降到任何想要的维度,例如将1000维的特征降至100维。这样的做法进行了数据压缩后,只会占用较少的计算机内存或磁盘空间,同时也加快了学习算法的运行速度。同时在许多学习问题中,如果我们将数据可视化,说不定可以寻找到一个更好的解决方案,降维也是其中常规采用的手段之一。假使我们有关于许多不同国家的数据,每一个特征向量都有50个特征(如GDP,人均GDP,平均寿命等)。如果要将这个50维的数据可视化是不可能的,因此使用降维的方法将其降至2维,我们便可以将其可视化了。这样做的问题在于,降维的算法只负责减少维数,产生的新特征有什么样的意义就需要我们自己去探索啦。2 主成分分析问题而在降维算法中,主成分分析(PCA)是最常见的。在PCA中,我们要做的是找到一个方向向量(Vector direction),把所有的数据都投射到该向量上时,我们希望投射的平均均方误差能尽可能地小。方向向量是一个经过**的向量,而投射误差是从特征向量向该方向向量作垂线的长度。下面给出主成分分析问题的描述:问题是要将维数据降至维,目标是找到向量,使得总的投射误差最小。需要注意的是,主成分分析与线性回归是两种不同的算法。主成分分析是要最小化投射误差(Projected Error),而线性回归则是需要最小化预测误差。线性回归的目的是预测结果,而主成分分析不作任何预测。上图中,左边是线性回归的误差(垂直于横轴投影),右边则是主要成分分析的误差(垂直于红线投影)。PCA将个特征降维到个,比如100维的向量最后可以用10维来表示,那么数据的压缩率为90%。图像处理领域的KL变换就是使用PCA进行图像压缩,同时确保降维后数据的特性损失最小。PCA技术的好处:1.对数据进行降维的处理时,可以对新求出的“主元”向量的重要性进行排序,根据需要取前面最重要的部分,将后面的维数省去,可以达到降维从而简化模型或是对数据进行压缩的效果,同时最大程度的保持了原有数据的信息。2.完全无参数限制的。在PCA的计算过程中完全不需要人为的设定参数或是根据任何经验模型对计算进行干预,最后的结果只与数据相关,与用户是独立的;3.但是这同时也是个缺点,如果用户对观测对象有一定的先验知识,掌握了数据的一些特征,却无法通过参数化等方法对处理过程进行干预,可能会得不到预期的效果,效率也不高。3 主成分分析算法PCA 减少维到维:第一步是均值归一化。计算出所有特征的均值,然后令 ,如果特征是在不同的数量级上,还需要将其除以标准差 。第二步是计算协方差矩阵(covariance matrix): 第三步是计算协方差矩阵的特征向量(eigenvectors)。可以利用奇异值分解(singular value decomposition)来求解: 对于一个维度的矩阵,上式中的是一个具有与数据之间最小投射误差的方向向量构成的矩阵。将数据从维降至维,只需要从中选取前个向量,获得一个维度的矩阵,用表示,然后通过如下计算获得要求的新特征向量 其中是维的。4 选择主成分的数量主要成分分析是减少投射的平均均方误差:训练集的方差为:我们希望在平均均方误差与训练集方差的比例尽可能小的情况下选择尽可能小的值。如果希望这个比例小于1%,就意味着原本数据的偏差有99%都保留下来了,如果选择保留95%的偏差,便能非常显著地降低模型中特征的维度了。我们可以先令,然后进行主要成分分析,获得和,然后计算比例是否小于1%。如果不是的话再令,如此类推,直到找到可以使得比例小于1%的最小值(原因是各个特征之间通常情况存在某种相关性)。当然还有一些更好的方式来选择,可以调用“svd”函数:其中的是一个的矩阵,只有对角线上有值,而其它单元都是0,可以使用这个矩阵来计算平均均方误差与训练集方差的比。例: 也就是:在压缩过数据后,可以采用如下方法来近似地获得原有的特征:5 重建的压缩表示PCA作为压缩算法通常会把1000维的数据压缩100维特征,那么如何回到原有的高维数据呢?如图中样本,把这些样本投射到图中一维平面上,会现在只需要使用一个实数,比如。而给定一个点,如何恢复到原始的二维空间呢?为2维,为1维,,相反的方程为:。如图:从低维数据回到未压缩的的原始数据 ,我们把这个过程称为重建原始数据。当试图重建初始值时,给定未标记的数据集,使用PCA,高维特征映射低维,反之,低维映射到原有的高维数据。6 主成分分析法的应用建议假使针对一张 100×100像素的图片进行某个计算机视觉的机器学习,即总共有10000个特征,步骤如下:1.首先运用主要成分分析将数据进行压缩2.然后对训练集运行学习算法3.在预测时,采用将输入的特征转换成特征向量,然后再进行预测注:如果有交叉验证集合测试集,也采用。使用主要成分分析的常见错误:1.将其用于减少过拟合(减少了特征的数量)。主要成分分析只是近似地丢弃掉一些特征,它并不考虑任何与结果变量有关的信息,因此可能会丢失非常重要的特征。然而当我们进行正则化处理时,会考虑到结果变量,不会丢掉重要的数据。2.默认主要成分分析为学习过程中的一部分,最好还是从所有原始特征开始,只在有必要的时候(算法运行太慢或者占用太多内存)才直接采用主要成分分析。好啦,今天的介绍就结束啦~下期小Mi带大家学习异常检测!我们下期再见呦(挥手十分钟)~~
  • [热门活动] 精心准备的工作汇报又双叒叕被打回?可能你真的没做好数据可视化
    相信大家在日常工作中对汇报并不陌生,这是最能体现自己工作成果,也是在老板面前展示自己,获得升职加薪的良机。花上一星期写方案报告,汇报半小时,各类数据轮番上阵,一场下来,老板却越听越迷糊,结果方案还被pass。 其实汇报的目的是要清楚地传递出最终成果和思考,也就是在最短的时间内输出最精华的内容,所以须得明白“一图胜千言”的重要意义,俗话说:字不如表,表不如图,相较于密密麻麻的文字和表格,数据可视化的方式更直观有趣,丰富的视觉效果和交互方式,引导用户主动探索信息,这些都比笼统的灌输,要让人轻松愉悦且更有助于其理解思考。华为云云市场合胜数据可视化平台,即是这样一个面向政府和金融行业客户,提供全面数据可视化的平台工具和解决方案。让海量数据背后的价值浮出水面,让更多的人领会到数据可视化的魅力。 合胜数据可视化平台的亮点:1、在视觉呈现上,合胜数据可视化平台提供丰富的视觉效果和交互方式,以多样化的互动、探索,让用户从数据信息中获得愉快体验,推动决策和行动;2、通过故事化的场景和直觉化的设计,让汇报演示生动活泼,听众可以直观的感受和理解数据信息,获得全知;3、支持实时数据的展现,采用流数据处理+实时数据推送,保证数据从处理到展现延迟最小,数据动态实时更新。4、可视化场景、视图、组件均可定制调整,编辑调整所见即所得,通过简单的的拖拽、配置,无需开发和设计经验,即可生成专业的可视化页面;支持多种主题、皮肤的切换选择。5、支持大屏、TV电视、PC终端、Pad移动端等多端呈现,同时支持多平间联动展示,互动操作。亦可对接大屏端展示做分辨率优化,满足特殊展示场景需要。6、为政府、金融行业等企业用户提供全面的数据可视化平台工具、咨询设计及定制化开发服务,帮助用户通过图形化界面轻松接入数据、构建各种设计风格的可视化视图,满足汇报展示、实时监控等多种数据展示场景需求。数据可视化是一种集多维于一体的呈现方式,能帮助我们更好的梳理,理解并且推进工作,其实无论工具如何优化,思维永远占据主导,内容需要被理解,故而能最大化思维成果的数据可视化才应运而生。文中提到的商品链接:合胜数据可视化平台【华为云云市场,助您上云无忧】
  • [技术干货] Python数据可视化—Matplotlib初体验
    Matplotlib初体验初次看到这个名字,是不是会想到另外一个著名的数学工具:Matlab(没想到也不要紧,毕竟 Matlab 是一个在数学及相关领域使用的专门工具)。之所以要提及 Matlab,是因为它在与数学有关的应用方面颇有些神通,历史也很悠久。但是,随着应用的要求越来越多,这个有点“古老”的工具,显得力不从心了,于是乎在数据分析、机器学习领域 Python 就异军突起。随着 Python 的广泛应用,还要有很多的工具分别实现不同的应用。那么,在数据可视化层面,最早出现的就是 Matplotlib,因此,标题称其为“开山鼻祖”,丝毫不为过。Matplotlib 的发明者是 John D. Hunter(一定要向大神献上敬意、崇拜和感谢).2003 年发布了 Matplotlib 的 0.1 版,一路发展而来,版本不断更迭、功能不断丰富。截止到写这段内容为止,官方网站(http://matplotlib.org/)上发布的最新版本是 3.02。Matplotlib 的使用方法有点类似于 Matlab。同时,它提供了“面向对象的 API”,让经过严格程序开发训练的人用起来也相当顺手。并且,它继承了 Python 的优良传统和一贯作风,即免费、开源和跨平台。随着技术的进步和时代的变迁,现在能够实现数据可视化的工具越来越多,它们都意欲向 Matplotlib 发起挑战。尽管如此,Matplotlib 的江湖地位依然稳固,并且有很多新生代工具也是依靠它而建立的,比如 Seaborn。因此,学习 Matplotlib,合算且有必要,更何况,Matplotlib 也在与时俱进。
  • [问题求助] 北向应用,设备通过NB-IoT将数据上传到物联网平台了,怎么创建应用将数据可视化的显示出,在哪个模块弄
    【功能模块】我已经将数据通过NB-IoT传到华为平台上了,想创建一个应用,将数据可视化的显示出来,我应该在哪一模块创建这个应用,该怎么弄呀【操作步骤&问题现象】1、2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [SaaS] 华为云是否支持多用户的报表和大屏定制能力?
    华为云DLV可支持报表定制,可配套华为云IAM的权限进行不同租户的报表管控。数据可视化(Data Lake Visualization,简称DLV)是一站式数据可视化开发平台,适配云上云下多种数据源,提供丰富多样的2D、3D可视化组件,采用拖拽式自由布局,旨在帮助您快速定制和应用属于您自己的数据报表和大屏。具体指导详见DLV产品文档https://support.huaweicloud.com/productdesc-dlv/dlv_07_001.html除此之外,华为云的合作伙伴帆软和永洪BI也提供专业的报表工具。详见华为云市场帆软:https://marketplace.huaweicloud.com/product/00301-672073-0--0永洪BI:https://marketplace.huaweicloud.com/product/00301-595056-0--0
  • [技术讨论] Python 数据可视化 小提琴图
    # -*- coding: utf-8 -*-"""Created on Tue Mar  9 20:16:57 2021@author: dujidan"""import matplotlib.pyplot as pltimport numpy as np# 设置上下限def adjacent_values(vals, q1, q3):    upper_adjacent_value = q3 + (q3 - q1) * 1.5    upper_adjacent_value = np.clip(upper_adjacent_value, q3, vals[-1])    lower_adjacent_value = q1 - (q3 - q1) * 1.5    lower_adjacent_value = np.clip(lower_adjacent_value, vals[0], q1)    return lower_adjacent_value, upper_adjacent_value# 设置坐标轴样式def set_axis_style(ax, labels):    ax.get_xaxis().set_tick_params(direction='out')    ax.xaxis.set_ticks_position('bottom')    ax.set_xticks(np.arange(1, len(labels) + 1))    ax.set_xticklabels(labels)    ax.set_xlim(0.25, len(labels) + 0.75)    ax.set_xlabel('Sample name')    # =============================================================================# 随机数据np.random.seed(123)data = [sorted(np.random.normal(0, std, 100)) for std in range(1, 5)]fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(9, 4), sharey=True)# 一般小提琴图ax1.set_title('Default violin plot')ax1.set_ylabel('Observed values')ax1.violinplot(data)# =============================================================================# 自定义小提琴图ax2.set_title('Customized violin plot')parts = ax2.violinplot(        data, showmeans=False, showmedians=False,  # 显示均值 中位数        showextrema=False)  # 显示上下界(极值)# 设置 每个图形的 颜色、边界色、透明度for pc in parts['bodies']:    pc.set_facecolor('#D43F3A')    pc.set_edgecolor('black')    pc.set_alpha(1)# 4 分位数quartile1, medians, quartile3 = np.percentile(data, [25, 50, 75], axis=1)whiskers = np.array([    adjacent_values(sorted_array, q1, q3)    for sorted_array, q1, q3 in zip(data, quartile1, quartile3)])whiskersMin, whiskersMax = whiskers[:, 0], whiskers[:, 1]inds = np.arange(1, len(medians) + 1)# 画中心点ax2.scatter(inds, medians, marker='o', color='white', s=30, zorder=3)# 设置线性ax2.vlines(inds, quartile1, quartile3, color='k', linestyle='-', lw=5)ax2.vlines(inds, whiskersMin, whiskersMax, color='k', linestyle='-', lw=1)# 设置坐标轴labels = ['A', 'B', 'C', 'D']for ax in [ax1, ax2]:    set_axis_style(ax, labels)# 调整 位置plt.subplots_adjust(bottom=0.15, wspace=0.05)plt.show()
  • [问题求助] 沃土数字平台的AI数据可视化大屏里面的折现图和柱状图组件都没有x轴和y轴标题配置
    【功能模块】组件高级设置【操作步骤&问题现象】1、右键打开高级设置2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [其他] 【问题咨询】数据可视化大屏饼状图数据设置问题,无法区分颜色
    1、数据来源是csv文件,查询预览如下,有三类数据2、饼状图数据属性设置如下,y为saleNumber,s为category。但展开s,子列中只能设置一个系列名和颜色,无法按颜色区分三个数据。3、预览效果如下,体验太差,不直观。请问,饼状图s数据,怎么为每个数据设置一个颜色?
  • [AI人工智能全栈成长...] 【问答官】AI技术在数据可视化中的应用如何
    AI技术在数据可视化中的应用如何,具体有什么例子。
  • [传感器适配] 进行激光雷达配置(实现点云数据可视化),Mviz收到转发数据
     您好,我按照《MDC300 1.0.029-T 产品文档.chm》说明文档  进行激光雷达配置(实现点云数据可视化), 出现了问题,能帮忙解答一下吗?1、目标:lidar数据透传,Mviz可视化;2、已经进行工作:velodyne-16激光雷达 接入了通用以太ID=4;激光雷达ID=3;激光雷达ip配置为192.168.13.23/24; 目的地址修改为广播IP地址255.255.255.255;(见图1图2)3、使用 tcpdump抓取了 激光雷达 数据包(应该是没问题,)root@mdchost:/home/mdc/opt/etc/lidar_mviz# tcpdump src 192.168.13.23  -c 100 -s 68 -vv tcpdump: listening on enp125s0f0, link-type EN10MB (Ethernet), capture size 68 bytes 01:18:46.625188 IP (tos 0x0, ttl 255, id 0, offset 0, flags [DF], proto UDP (17), length 1234)     192.168.13.23.2368 > 255.255.255.255.2368: [no cksum] UDP, length 1206 01:18:46.626531 IP (tos 0x0, ttl 255, id 0, offset 0, flags [DF], proto UDP (17), length 1234)     192.168.13.23.2368 > 255.255.255.255.2368: [no cksum] UDP, length 1206 01:18:46.627197 IP (tos 0x0, ttl 64, id 60983, offset 0, flags [none], proto UDP (17), length 540)     192.168.13.23.8308 > 255.255.255.255.8308: UDP, length 512 01:18:46.627840 IP (tos 0x0, ttl 255, id 0, offset 0, flags [DF], proto UDP (17), length 1234)     192.168.13.23.2368 > 255.255.255.255.2368: [no cksum] UDP, length 1206 01:18:46.629166 IP (tos 0x0, ttl 255, id 0, offset 0, flags [DF], proto UDP (17), length 1234)     192.168.13.23.2368 > 255.255.255.255.2368: [no cksum] UDP, length 1206 01:18:46.630494 IP (tos 0x0, ttl 255, id 0, offset 0, flags [DF], proto UDP (17), length 1234)     192.168.13.23.2368 > 255.255.255.255.2368: [no cksum] UDP, length 12064、依次执行了如下说明文档:4.1)MDC300接口文档:激光雷达数据透传;根据业务需要修改分发服务的配置文件“sensor_lidar_data_dispense_cfg.json”。修改如下:主要修改了SERVER ,......  "key": "SERVERINFO",   "value": {     "object[]": [ //一个激光雷达的配置,多个依次类推添加配置。         {             "key": "object",             "value": {                 "object[]": [                    //转发程序监听的IP地址和端口必须与激光雷达设备配置匹配。    {                         "key": "SERVER",                         "value": {                             "string": "192.168.13.23:2368"                         }                     },                    //转发的APP监听IP地址和端口,如有多个依次添加。    {                         "key": "CLIENT",                         "value": {                             "string": "192.168.1.6:3333"                         }                     },                    //转发的APP监听IP地址和端口,如有多个依次添加。    {                         "key": "CLIENT",                         "value": {                             "string": "192.168.1.6:4444"                         }                     }                 ]             }         }, ......4.2)MDC300接口文档:设备管理:数据隔离VLAN接口; 在“/home/root/conf”路径下,打开配置文件“devm_lidar_data_forward_config.json”,进行激光雷达数据的转发配置。修改如下:"key": "destNode",                 "value": {                     "string": "Host"                 },                 "checksum": 2704349418             },             {                 "key": "lidarId",                 "value": {                     "string": "3"                 },3)软件调测:Mviz用户指南:传感器数据显示:lidar_mviz注意:执行这个部分的第4. 步骤发生了问题:4.进入目录“/home/mdc/opt/bin/lidar_mviz”,执行如下命令。./lidar_mviz <instanceId> <instanceId> ...(参数值参考表1),运行lidar_mviz程序root@mdchost:/home/mdc/opt/bin/lidar_mviz$ ./lidar_mviz 3问题描述:bash: ./lidar_mviz: No such file or directory是不是设置环境变量有问题?)
  • [热门活动] 【活动已结束】【DevCloud · 敏捷智库】【合辑】 回帖赢码豆,快来分享你的观点吧!
    你的团队是否在践行敏捷开发?在敏捷实践过程中,你是否遇到了各种各样的问题?【DevCloud · 敏捷智库】系列合辑收录了敏捷实践过程中常见的FAQ,每个FAQ都由专家针对具体问题,结合沉淀了华为近30年研发经验的DevOps平台——DevCloud,给出切实可行的解决方法。快来听听专家的解答吧,这里一定有你关心的问题。202006月最佳回复奖:张辉    202007月最佳回复奖:张辉20200615期获奖名单已经公布,详情请见:https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=60462&page=1&extra=#pid23025220200622期获奖名单已经公布,详情请见:https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=61496&extra=page%3D120200629期获奖名单已经公布,详情请见:https://bbs.huaweicloud.com/forum/thread-62668-1-1.html20200706期获奖名单已经公布,详情请见:https://bbs.huaweicloud.com/forum/thread-63700-1-1.html20200713期获奖名单已经公布,详情请见:https://bbs.huaweicloud.com/forum/thread-65760-1-1.html20200727期获奖名单已经公布,详情请见:https://bbs.huaweicloud.com/forum/thread-68269-1-1.html20200803期获奖名单已经公布,详情请见:https://bbs.huaweicloud.com/forum/thread-69651-1-1.html20200810期获奖名单已经公布,详情请见:https://bbs.huaweicloud.com/forum/thread-70641-1-1.html【DevCloud · 敏捷智库】系列合辑,持续更新中:·规划和设计1. “用户故事等于需求说明”——你一定没有写好用户故事2. 如何拆分用户故事·计划和跟踪1. 如何避免重要需求遗漏?2. 如何进行需求优先级管理?3. 软件项目需求变更频繁,如何做好有效的需求管理和规划?4. 如何进行需求结构化管理?5. 敏捷实践:一周的Sprint太短,可以调吗6. 敏捷实践之Sprint Backlog在看板中的移动7. 物理看板和电子看板该如何选择?(内附下载材料)8. Scrum和看板如何选择9. 软件开发团队如何管理琐碎、突发性任务(内附下载材料)10. 读懂敏捷需求管理的4个关键词11. 如何估算第一篇:利用用户故事了解需求(内附下载材料)12. 如何估算第二篇:利用核心概念解决估算常见问题(内附下载材料)13. 如何估算第三篇:利用故事点做估算14. 如何估算第四篇:了解常见的估算方法15. 开发团队中的任务没人领取,你头疼吗?·迭代开发1. 江湖茶馆——Scrum四大事件之一 “每日站会”2. 如何玩转每日站会?(内附下载材料)3. 如何让敏捷回顾会议更有效果,这样做就对了·持续交付·其它1. 项目团队人员变动频繁,如何对新人进行有效培养和管理?2. 如何有效管理用户声音?3. Scrum Master如何引导团队中的刺头4. “敏捷+ DevOps”先行,效能提升助推企业升级5.需求总是无法按时交付怎么办
  • [问题求助] 求appengine消费mqs数据可视化呈现案例及样例代码,多谢
    求appengine消费mqs数据可视化呈现案例及样例代码,多谢
  • Cassandra Insert流程解析
        本文基于Cassandra 3.11版本原生代码,解析Insert流程的处理过程1)从 datastax 的官方 driver 开始,代码如下:1    public static void main(String[] args) {     2        String query = "INSERT INTO USER (uid, group_id, nick) VALUES(1, 1, 'ram_test');";     3        Cluster cluster = Cluster.builder().addContactPoint("127.0.0.1").build();     4        Session session = cluster.connect();     5        session.execute("USE tp");     6        session.execute(query);     7        System.out.println("query executed");     8    }2)以上代码是 插入一条数据到 Cassandra 中的示例,看看它是如何一步步写Cassandra中的。调用 session.execute(query) 时,driver 为cql 创建一个 SimpleStatement 对象,然后调用 this.executeAsync(statement) 去执行cql。代码如下:01    public ResultSetFuture executeAsync(final Statement statement) {     02        if (this.isInit) {     03            DefaultResultSetFuture future = new DefaultResultSetFuture(this, this.cluster.manager.protocolVersion(), this.makeRequestMessage(statement, (ByteBuffer)null));     04            (new RequestHandler(this, future, statement)).sendRequest();     05            return future;     06        } else {     07            final ChainedResultSetFuture chainedFuture = new ChainedResultSetFuture();     08            this.initAsync().addListener(new Runnable() {     09                public void run() {     10                    DefaultResultSetFuture actualFuture = new DefaultResultSetFuture(SessionManager.this, SessionManager.this.cluster.manager.protocolVersion(), SessionManager.this.makeRequestMessage(statement, (ByteBuffer)null));     11                    SessionManager.this.execute(actualFuture, statement);     12                    chainedFuture.setSource(actualFuture);     13                }     14            }, this.executor());     15            return chainedFuture;     16        }     17    }3)关注 makeRequestMessage 方法来了解如何构造请求信息的,根据 Protocol 生产 Request (继承自 Message),通过 tcp 将请求发送至 Cassandra。下面来看一下Cassandra 是如何接受消息并处理的(tcp 通信使用Netty框架)。Message.java (package org.apache.cassandra.transport)中的 Dispatcher 类是处理 tcp 请求的入口,ProtocolDecoder类是Message解密器,实例化Message 类;channelRead0() 消息处理类01    try     02    {     03        assert request.connection() instanceof ServerConnection;     04        connection = (ServerConnection)request.connection();     05        if (connection.getVersion().isGreaterOrEqualTo(ProtocolVersion.V4))     06            ClientWarn.instance.captureWarnings();     07     08        QueryState qstate = connection.validateNewMessage(request.type, connection.getVersion(), request.getStreamId());     09     10        logger.trace("Received: {}, v={}", request, connection.getVersion());     11        response = request.execute(qstate, queryStartNanoTime);     12        response.setStreamId(request.getStreamId());     13        response.setWarnings(ClientWarn.instance.getWarnings());     14        response.attach(connection);     15        connection.applyStateTransition(request.type, response.type);     16    }     17    catch (Throwable t)     18    {     19        JVMStabilityInspector.inspectThrowable(t);     20        UnexpectedChannelExceptionHandler handler = new UnexpectedChannelExceptionHandler(ctx.channel(), true);     21        flush(new FlushItem(ctx, ErrorMessage.fromException(t, handler).setStreamId(request.getStreamId()), request.getSourceFrame()));     22        return;     23    }     24    finally     25    {     26        ClientWarn.instance.resetWarnings();     27    }4)Request类的execute() 方法为 具体执行 cql 的方法,以本例的 cql 来说,真正的 Message 对象为 QueryMessage 类,下面请移步至 QueryMessage 的 execute方法,跟踪如下调用Message.Response response = ClientState.getCQLQueryHandler().process(query, state, options, getCustomPayload(), queryStartNanoTime);5)进入 process 方法中01    public ResultMessage process(String queryString, QueryState queryState, QueryOptions options, long queryStartNanoTime)     02        throws RequestExecutionException, RequestValidationException     03    {     04        ParsedStatement.Prepared p = getStatement(queryString, queryState.getClientState());     05        options.prepare(p.boundNames);     06        CQLStatement prepared = p.statement;     07        if (prepared.getBoundTerms() != options.getValues().size())     08            throw new InvalidRequestException("Invalid amount of bind variables");     09     10        if (!queryState.getClientState().isInternal)     11            metrics.regularStatementsExecuted.inc();     12     13        return processStatement(prepared, queryState, options, queryStartNanoTime);     14    }6)下面先分析 ParsedStatement.Prepared p = getStatement(queryString, queryState.getClientState());01    public static ParsedStatement.Prepared getStatement(String queryStr, ClientState clientState)     02        throws RequestValidationException     03    {     04        Tracing.trace("Parsing {}", queryStr);     05        ParsedStatement statement = parseStatement(queryStr);     06     07        // Set keyspace for statement that require login     08        if (statement instanceof CFStatement)     09            ((CFStatement)statement).prepareKeyspace(clientState);     10     11        Tracing.trace("Preparing statement");     12        return statement.prepare(clientState);     13    }7)先进入QueryProcessor类的parseStatement()方法看cql如何解析,以本例来说,Cql_Parser 类的 cqlStatement() 方法中请看如下代码片段01    case 2 :     02        // Parser.g:210:7: st2= insertStatement     03        {     04        pushFollow(FOLLOW_insertStatement_in_cqlStatement88);     05        st2=insertStatement();     06        state._fsp--;     07     08         stmt = st2;     09        }     10        break;8)进入insertStatement()方法中查看normalInsertStatement(),此方法中两个局部变量1    List<ColumnDefinition.Raw> columnNames  = new ArrayList<>();     2    List<Term.Raw> values = new ArrayList<>();9)columnNames 存储要插入的列,values 存储需要插入的值,方法返回 new UpdateStatement.ParsedInsert(cf, attrs, columnNames, values, ifNotExists);记住 UpdateStatement.ParsedInsert 实例,此时需要插入的字段与值保存在这,到此 ParsedStatement 准备完毕。继续分析 statement.prepare(clientState),查看 prepareInternal() 方法,对于本例来说是 UpdateStatement 类的 prepareInternal() 方法,关注如下代码片段:01    for (int i = 0; i < columnNames.size(); i++)     02    {     03        ColumnDefinition def = getColumnDefinition(cfm, columnNames.get(i));     04     05        if (def.isClusteringColumn())     06            hasClusteringColumnsSet = true;     07     08        Term.Raw value = columnValues.get(i);     09     10        if (def.isPrimaryKeyColumn())     11        {     12            whereClause.add(new SingleColumnRelation(columnNames.get(i), Operator.EQ, value));     13        }     14        else     15        {     16            Operation operation = new Operation.SetValue(value).prepare(cfm, def);     17            operation.collectMarkerSpecification(boundNames);     18            operations.add(operation);     19        }     20    }10)将columnValues 中的值(需要插入的值),转换成 Operation 类,次类中两个重要属性 ColumnDefinition 和 TermColumnDefinition  存储更新的列的 meta 信息,Term 存储要更新的值,execute() 方法将  这个两个属性 组成 Cell 存储到 UpdateParameters 中。Operation 添加到Operations 中,方法最后 return new UpdateStatement(),到此,getStatement() 方法分析完毕。下面看 processStatement(prepared, queryState, options, queryStartNanoTime) 方法执行流程,跟踪代码到 executeWithoutCondition(queryState, options, queryStartNanoTime)中,代码如下:01    private ResultMessage executeWithoutCondition(QueryState queryState, QueryOptions options, long queryStartNanoTime)     02        throws RequestExecutionException, RequestValidationException     03    {     04        ConsistencyLevel cl = options.getConsistency();     05        if (isCounter())     06            cl.validateCounterForWrite(cfm);     07        else     08            cl.validateForWrite(cfm.ksName);     09     10        Collection<? extends IMutation> mutations = getMutations(options, false, options.getTimestamp(queryState), queryStartNanoTime);     11        if (!mutations.isEmpty())     12            StorageProxy.mutateWithTriggers(mutations, cl, false, queryStartNanoTime);     13     14        return null;     15    }11)本方法中,重点关注 getMutations 和 StorageProxy.mutateWithTriggers(),下面继续跟踪 getMutations(),此方法中查看 addUpdates(collector, options, local, now, queryStartNanoTime)。两个重要调用 PartitionUpdate upd = collector.getPartitionUpdate(cfm, dk, options.getConsistency()) 、addUpdateForKey(upd, clustering, params);getPartitionUpdate 方法创建 Mutation 并向其中添加 PartitionUpdate;addUpdateForKey 将 UpdateParameters 参数添加到 PartitionUpdate  的 BTree.Builder 中用来构建 Btree,至此突变准备完成,下面将执行更新操作。跟踪 StorageProxy.mutateWithTriggers(mutations, cl, false, queryStartNanoTime), 进入 StorageProxy.sendToHintedEndpoints(),跟踪performLocally(stage, Optional.of(mutation), mutation::apply, responseHandler), 此时需要关注 mutation::apply,进入 apply()方法,跟踪到 KeySpace.applyInternal() 调用 CommitLog.instance.add(mutation); 提交日志调用ColumnFamilyStore.apply() 写入memtable
总条数:38 到第
上滑加载中