大数据
文章平均质量分 80
大数据
超可爱慕之
人生中的每一段低潮,都是命运给你特批的长假。
展开
-
2021.5.20 sparksql的Dataframe的api(更新中)
dataframe的api使用原创 2021-05-21 00:10:39 · 491 阅读 · 0 评论 -
2021.5.16数仓之用户画像表模型设计
第三个业务:用户画像 - 统计当天7日活跃用户业务分析:要统计7日活跃用户情况需要找到用户基本信息 & 用户每日登陆情况用户基本信息来源:1.支付宝注册用户2.微信注册用户3.qq注册用户4.App注册用户 - 使用app注册点歌充值消费这4类注册信息在ycak业务库,对应的4类注册用户用户每日登陆情况:...原创 2021-05-16 21:57:14 · 1088 阅读 · 0 评论 -
2021.5.12 一些概念的梳理和方法论
维度表:缓慢变化维非缓慢变化维事实表:事务型事实表周期快照型事实表累计快照型事实表Bitmap用户分群在贝壳DMP的实践和应用https://cloud.tencent.com/developer/article/1684659方法论:以上待整理…...原创 2021-05-12 23:51:01 · 159 阅读 · 0 评论 -
2021.5.9数仓之机器详情ODS EDS DM分层设计
第二个业务:机器详细信息统计需求目前要根据两个业务系统中的数据统计机器基础详细信息。这两个业务系统对应的关系型数据库分别是“ycak”“ycbk”。“ycak”库中存在两张机器相关的数据库表如下:“machine_baseinfo”机器基本信息表,机器的系统版本,歌库版本,UI版本,最近登录时间相关。“machine_local_info”机器位置信息日全量表,机器所在的省市县及详细地址,运行时间和销售时间相关。“ycbk”库中存在6张表,分别如下:“machine_admin_map”机器原创 2021-05-09 22:32:04 · 1199 阅读 · 0 评论 -
2021.5.9数仓之Superset BI可视化工具使用及原理
Superset基于Linux的安装1.安装superSet之前安装基础依赖yum install gcc gcc-c++ libffi-devel python-devel python-pip python-wheel openssl-devel libsasl2-devel openldap-devel2.官网下载Anconda ,选在linux版本,并安装下载官网地址:https://www.anaconda.com/products/individual#macos3.将下载好的an原创 2021-05-09 20:55:22 · 834 阅读 · 1 评论 -
2021.5.7数仓之Azkaban任务流调度使用及原理
使用Azkaban配置任务流这里使用Azkaban来配置任务流进行任务调度。集群中提交任务,需要修改项目中的application.conf文件配置项:local.run=“false”,并打包。首先保证在Hive中对应的表都已经创建好。然后在安装azkaban的mynode5节点”/software/musicproject/”路径下准备如下脚本:清洗客户端日志脚本 1produce_clientlog.sh#!/bin/bashcurrentDate=`date -d today +"%Y原创 2021-05-07 20:38:13 · 1139 阅读 · 0 评论 -
2021.5.6Azkaban的安装
安装部署Azkaban大数据业务处理场景中,经常有这样的分析场景:A任务:将收集的数据通过一系列的规则进行清洗,然后存入Hive 表a中。B任务:将Hive中已存在的表b和表c进行关联得到表d。C任务:将A任务中得到的表a与B任务中得到的表d进行关联得到分析的结果表e。D任务:最后将Hive中得到的表e 通过sqoop导入到关系型数据库MySQL中供web端查询使用。显然,以上任务C依赖于任务A与任务B的结果,任务D依赖于任务C的结果。我们一般的做法可以打开两个终端分别执行任务A与任务B,当任务原创 2021-05-06 23:42:49 · 437 阅读 · 0 评论 -
2021.5.4数仓之歌手影响力指数分析
将ODS层的表TO_SONG_INFO_D清洗到EDS层TW_SONG_BASEINFO_D,可以使用HQL或者sparksql去完成,会用到定义UDF函数,或者一些聚合的使用UDAF函数,还有UDTF函数,写一个类extends UDF实现它的方法,现在使用的是sparkSQL,里面也有UDF和UDAF函数,但是没有UDTF函数,有一个算子叫做flatMap就是一对多的。同样的,SQL里面还有一个explode函数,完全可以去实现一对多。这里主要使用的是sparkSQL去清洗的,也使用到了sparkSQ原创 2021-05-04 21:37:06 · 223 阅读 · 0 评论 -
2021.5.3数仓之歌曲影响力指数分析
问题:sqoop可以将mysql的数据直接导入的hive的一张表中,那么为什么这里要导入到hdfs的路径呢?而且hive的表也不是分区表。原因:我们要导入的外部表,如果直接使用sqoop的方法会有什么问题?我们对应的这个模型文件里面,可以看到song这张表的字段,有一个source_id和name,如果要是真的按照sqoop直接将MySQL的表导入到hive的一张表里面,它能不能按照建表的字段去设置?一定是不行的。它会直接将MySQL的字段导入到hive里面,生成一张表,表名是指定的,但字段名就和My原创 2021-05-03 22:03:58 · 227 阅读 · 0 评论 -
2021.4.29项目架构及数仓分层、主题设计
==== 业务需求: 统计歌曲热度、歌手热度 =====用户可以登录机器进行点播歌曲,根据用户过去每日在机器上的点播歌曲统计出最近1日、7日、30日歌曲热度及歌手热度需要统计的指标:1日-7日-30日 歌曲热度1日-7日-30日 歌手热度===== 需求分析 =====根据 “微信指数”来统计 歌曲、歌手热度。根据微信指数统计热度需要统计歌曲的以下指标:1日歌曲的点唱量1日歌曲的点赞量1日歌曲的点唱用户数1日歌曲的点唱订单数7日歌曲的点唱量7日歌曲的点赞量7日歌曲的最高点唱量7原创 2021-04-29 20:54:45 · 233 阅读 · 0 评论 -
2021.4.26数据仓库之数据仓库分层设计与命名规范
复习:上节课从维度建模开始说的,维度建模是源自于数据集市,数据集市的概念是由拉尔夫金博尔提出来的,维度建模主要应用的领域是OLAP的领域,就是数据分析的场景,维度建模里面只有事实表和维度表,事实表就是现实世界中的操作型事件就放在事实表里面,事实表是由维度和度量来组成的,维度就是看数据的角度,他和主题的区别就主题是一个更大的角度,维度就是主题底下的某一些小的角度去观察度量,事实表中的每一个维度,都是会有一个维度表与它一一对应,就像主外键关联,可以在事实表里关联到更多的维度属性来对度量进行统计,那维度表更像是原创 2021-04-26 22:03:41 · 2801 阅读 · 2 评论 -
2021.4.24数据仓库之维度建模与数据仓库分析模型
课前回顾:数据库与ER建模,数据库指的是关系型数据库,数据库里面这些表符合三范式,这三范式分别是什么自己回忆一下,后面又提到ER实体关系模型建模,我们提到了给你一个业务场景,需要建表的时候要抽离出来实体、属性、关系,画出ER实体关系模型图,实体用方框表示,属性用椭圆表示,关系用菱形来表示,更习惯的是把ER实体关系模型图转成IDEF1X表的格式看起来更舒服,后面又提到了为什么要构建数据仓库,数据仓库说了几点关系型数据库解决不了的问题,主要大致分为两点,1点关系型数据库里存的数据,都是面向OLTP的操作,联机原创 2021-04-24 22:28:16 · 635 阅读 · 0 评论 -
2021.4.23数据仓库之数据库范式与ER实体关系模型建模
基于spark的综合数仓平台的项目——音乐数据中心平台项目架构 使用到的技术 和真实的生产环境使用的技术相同整体项目也是市面上大多数公司常用的结构补充数仓的基础知识:问:现在公司是不是都在用阿里云的技术?答:现在有些公司在用阿里云,有些公司也没在用阿里云。数据库与ER建模数据库DataBase:数据库是按照数据结构来组织、存储和管理数据的仓库,是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。这里主要指的是Web中的关系型数据库,存储和支撑我们Web平台正常运行的事原创 2021-04-24 10:27:33 · 871 阅读 · 0 评论 -
2021.1.23基于Spark MLlib训练回归算法模型
上节课讲的重点是 : 梯度下降法目的:优化损失函数调整w参数,让误差达到最小,可以称,梯度下降法是损失函数的优化函数让w尽快的找到一个最合适的,以至于让我们的误差达到最小。梯度下降法是怎么让我们尽快的找到一个最合适的w的呢?会通过导数,来决定w参数调整的 方向,使用α学习率以及导数的乘积,作为调整幅度,关于导数起了两部分作用一:指挥w参数的调整方向二:参与w的调整,因为每次w调整多大,是学习率乘以导数,为什么来使用这样一个公式调整w参数?为什么在调整w参数的时候让导数也参与进来?为什么原创 2021-01-23 15:00:52 · 428 阅读 · 1 评论 -
2021.1.21线性回归算法的原理及参数优化方案
只需要知道用什么样的算法能够解决什么样的需求,不同的算法怎么去调参、调优出去面试的时候可能会问一些公式的推导,经常问的都会去推导复习:核心:总结了机器学习的套路1.随机产生w参数2.把w参数与样本数据带入到误差函数中(最小二重法,损失函数,目标函数,误差函数都是这同一个公式)求解误差值3.误差值与用户指定的误差阈值比较,4.如果大于用户指定的误差阈值,继续调整w参数,(2,3,4)5.如果误差小于用户指定的误差阈值,那么此时的w参数就是最佳的w参数问题:怎么调整w参数?比如现在w=1原创 2021-01-21 17:03:36 · 2378 阅读 · 0 评论 -
2021.1.20机器学习介绍、原理及应用场景
之前学习的技术主要解决了两类问题:1.海量数据的存储2.海量数据的计算都是基于历史数据进行总结统计,基于统计出来的指标对于公司的决策做出一定的变化,这个过程叫做BI 商业智能有总结就得有展望,对未来做预测基于之前学的技术是无法做展望的,之前学习的技术只能对过去做总结机器学习:展望未来如何基于历史数据去展望预测未来!机器学习的场景:语音交互软件:Siri,Cortana,Now (预测)Google利用大数据+机器学习预测H1N1在美国某小镇爆发的可能(预测)2016年8月,IBM 智原创 2021-01-20 20:09:38 · 887 阅读 · 0 评论 -
2020.11.28(spark-sql-源码、sql解析、dataset到rdd)
接上节课:2020.11.23(spark-sql、复杂SQL、函数、自定义函数)带点理论为下节课讲源码铺路。如果想聊sqarkSQL这里面最重要的是SQL,这里面有很多的细活,首先,第一个维度,如果SQL是个字符串,(SQL在之前的认知里就是个字符串)。这个字符串是如何变成逻辑、指令、计算,作用在数据上的,其实它经历了如下的步骤:既然是个字符串,第一步就是要对字符串的词法分析,这个字符串按关键字分词,其实把SQL写成Java语言等等,只要是语言语法的,其实SQL也是门语言,language,上来第原创 2020-11-28 21:24:11 · 284 阅读 · 0 评论 -
2020.11.23(spark-sql、复杂SQL、函数、自定义函数)
写SQL的时候都会遇到一个东西,函数。尤其写SQL的时候有两类场景,OLTP和OLAP,OLTP的时候也会写函数,但是多数情况属于时间函数、日期函数、金额函数,OLTP就是平常CRUD的时候,对着数据库发起的快速的,返回结果的。OLAP趋向于分析型的,时间粒度,OLAP会比OLTP复杂度高一点,分析的时候会卡在对数据,不是简单的一个单元格的值的修正,可能要做很多分组的值的转换,关联的操作,OLTP真正实操的时候也会将表里的东西转成视图,尽量做一些视图的物化等等。来缩减OLTP有可能做数据关联的时间复杂度。原创 2020-11-23 23:11:24 · 620 阅读 · 0 评论 -
2020.11.21(整合hive的metastore搭建2)
上节课刻意的在什么外界都不用的情况下,spark自己就可以玩,外界不需要准备其它的,搭建环境,jvm都不需要,只要enableHiveSupport(),就可以包含的启动一个metastore,支持我们的DDL语句,等等操作,但是这节课主要讲贴近企业级的使用,在生产环境中是不会这么去玩的,强调一点:很多人学习架构的事情会很在意项目这件事情,但是如果学大数据,不要刻意的把项目放在心上,项目是被弱化的,大数据公司不可能启动了一个项目,为你准备了500台机器,然后把数据拷给你一份,几百T的数据,过两天又要启动一个原创 2020-11-22 00:08:52 · 934 阅读 · 1 评论 -
2020.11.19(整合hive的metastore搭建)
简单回顾下:现在在讲spark-sql,以SQL为中心的,面向SQL,spark做了很多努力,比如给我们提供了DataSet以及它的子集DataFrame,DataSet既可以按照collection的风格处理数据集,而且也面向SQL增加了可以处理SQL的api,这节课先强化一下这些知识点。比如整合api的,依然是通过api的方式得到了一个session,session是spark-sql里非常重要的概念,有了session之后怎么能得到一个数据集?比如通过List,里面放一些元素:import se原创 2020-11-19 22:14:07 · 662 阅读 · 0 评论 -
2020.11.16大数据中的SQL组成原理
什么是SQL?sql在分布式环境中,第一个想到的产品是hive为什么hive出现?元数据!在传统数据库的时候被隐藏了把数据都存储到hdfs中,各个部门,各种类型的数据,以文本的形式存放的。会有很多目录和文件,做数据库的时候都希望人为干预的压缩,表常使用0和1来表示,如果要知道某某文件第某某列代表的是什么意思,外挂字典表来翻译0和1分别代表什么面向数据的时候,数据存成模型/模式的特征,站在文件这个模式下,把数据以文件来存储,文件可以得到两类数据,data(打开文件看到的一大堆字符)和元数据(文件级别原创 2020-11-16 12:30:29 · 293 阅读 · 0 评论 -
2020.11.17(datafram到dataset开发)
这节课继续讲spark-sql上节课讲了什么是SQL(引出了它的特征,在分布式下解析的过程)、什么是hive在大数据里面(spark-sql也是趋向于和hive整合的),上节课讲的是理论,这节课从代码开始。在讲spark-core的时候有一个上下文的类是spark context可以维护创建RDD,提交作业的过程,sql靠的包装外挂的东西把它丰富起来了,尤其dataSet对上层RDD的包裹。dataSet最终要转换会RDD才能触发作业。sql 字符串 -> dataset 对rdd的一个包装(优原创 2020-11-17 20:11:44 · 412 阅读 · 0 评论 -
Sqoop知识点总结
SqoopSqoop简介Sqoop是一个用于在Hadoop和关系数据库之间传输数据的工具导入:从关系型数据库到Hadoop平台导出:从Hadoop平台到关系型数据库本质:将导入导出命令翻译成MapReduce程序并行执行场景:常用于数仓中业务数据导入Sqoop命令导入:sqoop import常规导入sqoop import --connect jdbc:mysql://hadoop102:3306/retail_db --driver com.mysql.jdbc.Driver原创 2020-10-14 08:45:36 · 162 阅读 · 0 评论 -
HBase知识点总结
HBaseNoSQLNoSQL概念NoSQL理论NoSQL理论.pptxHBase介绍HBase的起源起源于谷歌论文BigTable高可靠性,高性能,面向列,可伸缩的分布式存储系统列存储的非关系型数据库目标:存储并处理大型数据特点海量存储列式存储列族易扩展基于上层处理能力的扩展(regionServer)基于存储的扩展(HDFS)高并发HBase的架构HDFS底层HBasezookeeper原创 2020-10-14 08:44:32 · 193 阅读 · 0 评论 -
ZooKeeper知识点总结
ZooKeeperZookeeper概述概述Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目。ZooKeeper角色Leader(领导者)负责进行投票的发起和决议,更新系统状态Follower(跟随者)用于接收客户端请求并向客户端返回结果,在选主过程中参与投票Observer(观察者)可以接收客户端连接,将写请求转发给Leader节点。但Observer不参加投票过程,只同步Leader状态。特点zk Service原创 2020-10-14 08:41:41 · 161 阅读 · 0 评论 -
2020.10.2(hive优化、文件类型、hiveserver2高可用)
之前在配置hiveserver2的时候,在core-site里添加了两个额外的属性这东西到底怎么回事,打开hadoop2.6.5的官网,在common里面有一个superusersuperuser看对应的解释:A superuser with username 'super'wants to submit job and access hdfs on behalf of a user joe. The superuser has kerberos credentials but user joe原创 2020-10-02 11:39:45 · 440 阅读 · 0 评论 -
2020.9.28(Hive视图、索引、权限管理)
回顾:上节课讲了hive的参数设置,hive的运行方式,hive的动态分区,分桶,lateral view这五个知识点。遗留了两个问题:1.看一下hive的源码,现在面试中,hive的源码还从来没有被问到过。在hive这个环节不会浪费太多时间,把源码讲清楚,没有必要。但是虽然不讲源码的详细知识点,但是会告诉你,如果拿到一个陌生框架之后,应该怎么去找源码,或者怎么去看源码。有同学把源码下载回来了一脸懵逼,连入口都找不到。今天讲一下入口该怎么找:大部分 不管是hadoop、hive、hbase、spark原创 2020-09-28 23:57:01 · 2151 阅读 · 0 评论 -
2020.9.27(hive参数设置、运行方式、动态分区、分桶)
除了第一节课讲概念理论之外,后面的操作都是比较细的点,因为hive的技术点没办法,到公司使用的时候也是一些非常琐碎的点,各个点之间没有太多的关联性。这10分钟可能讲这个知识点,下10分钟可能另外一个技术点了,一点关联都没有,是没办法的。hive里更多的是基本操作的问题。要有复习总结的过程。第一个知识点:hive参数操作和运行方式hive的参数操作:hive应该如何设置对应的参数?之前搭建集群的时候,在hive-site.xml里面进行过基本的参数修改,但在企业里面可能不全是往hive-site.xml原创 2020-09-27 19:53:11 · 988 阅读 · 1 评论 -
2020.9.27(Hive函数)官方文档中文翻译版
Hive函数 Hive中提供了非常丰富的运算符和内置函数支撑,具体操作如下:1.内置运算符1.1关系运算符运算符类型说明A = B所有原始类型如果A与B相等,返回TRUE,否则返回FALSEA == B无失败,因为无效的语法。 SQL使用”=”,不使用”==”。A <> B所有原始类型如果A不等于B返回TRUE,否则返回FALSE。如果A或B值为”NULL”,结果返回”NULL”。A < B所有原始类型如果A小于B返回TRU原创 2020-09-27 19:52:33 · 1516 阅读 · 0 评论 -
2020.9.27(Hive Serde、HiveServer2、Hive函数)
回顾:上节课讲了hive的基本语句,DDL,DML和MySQL差不多,但是也有一些自己独特的东西,比如在定义一张表的时候需要指定行格式。这节课开始,hive的点就比较琐碎了。Hive SerdeHive SerDe - Serializer and Deserializer –SerDe 用于做序列化和反序列化。什么意思?hive在运行过程中,数据是存储在hdfs的,但是执行引擎是mapreduce,这两个之间有必然的关系么?写的都是SQL语句,可以通过load的方式加载数据,也可以直接向h原创 2020-09-26 23:53:15 · 1028 阅读 · 0 评论 -
2020.9.20(Hive的远程元数据服务模式安装及Hive SQL)
回顾:hive是一个数据仓库,建了表,进行了相应的基本操作,和关系型数据库是差不多的。01 Hive的基本介绍1、hive产生的原因· a) 方便对文件及数据的元数据进行管理,提供统一的元数据管理方式 b) 提供更加简单的方式来访问大规模的数据集,使用SQL语言进行数据分析2、hive是什么?The Apache Hive ™ data warehouse software facilitates reading, writing, and managing large datasets r原创 2020-09-20 19:53:13 · 703 阅读 · 0 评论 -
2020.9.20(hive的架构介绍及远程数据库模式安装)
每一个技术的产生一定是因为出现了解决不了的问题,所以才会有新技术来解决现在需要的问题。Hive是用来解决什么问题而存在的?在没了解hive的知识点之前,一定要知道为什么要有它,这样的话学起来才会更有动力和感觉。一定要跟着感觉走,兴趣才是最重要的...原创 2020-09-19 23:56:08 · 466 阅读 · 0 评论 -
2020.9.14(IDEA开发MapReduce的wordcount程序)
IDEA开发MapReduce的wordcount程序在hadoop-MapReduce-yarn集群的搭建完成之后(参考上篇博客)。运行的环境有了,现在要做开发。基于IDEA在maven的层面去做,如果想写api的话,maven中要补全库。在poem.xml中要补全一些东西。1.找到maven的网站,搜索hadoop上次做hdfs开发的时候引了Apache Hadoop Common和Apache Hadoop HDFS其实hadoop想的特别好,他有一个Apache Hadoop Clien原创 2020-09-15 00:23:29 · 745 阅读 · 0 评论 -
2020.9.14(hadoop-MapReduce-yarn集群的搭建)
目标:yarn的搭建,在上面跑MapReduce,自己写出代码回顾:1.最终去开发MapReduce计算程序2.新版本,hadoop2.x 出现了yarn:资源管理 -> MR没有后台的长服务yarn模型:container 容器,里面会运行我们的application master,map/reduce task目的:解耦计算程序和资源调度MapReduce on yarn架构:角色:resource manager 和 node manager搭建:将角色变成相应的活动JVM运原创 2020-09-14 15:46:05 · 388 阅读 · 0 评论 -
2020.9.13(MapReduce原理,Yarn原理)
在某个领域比我牛的人,一定是我不擅长的领域。我擅长的领域,没有几个比我牛的。今天把前面的知识稍微的讲一讲,主要是交学习方法。如果只是干讲知识的话,后面学习新的知识的时候,等于会重复造轮子,没有学习方法,更强调的是学习方法。随着学的东西越来越多,会有一个感觉,我学的这个东西和前面的东西好像。这时候如果能找到这个感觉的话,是件好事。因为技术是经常迭代更新的。比如说从hdfs说起,它的模型-存储模型,主要描述它的特征:切块,块散列到及群里,为了分治,在讲hdfs分布式文件系统的时候还刻意强调一点,通过模型要关原创 2020-09-13 23:57:19 · 311 阅读 · 0 评论 -
2020.9.13(mapreduce入门及计算模型)
Map:以一条记录为单位做映射~!Reduce:以一组为单位做计算~!什么叫做一组?分组~!抽取相同的特征,key依赖一种数据格式:key:value 键值对k,v的实现:由map映射实现的为什么叫MapReduce?Map:映射、变换、过滤 1进N出Reduce:分解、缩小、归纳 1组进N出(KEY,VAL):键值对的键划分数据分组输入数据集 =Map()=> 中间数据集 =Reduce()=> 最终结果集后面还有一个计算数据集SPARK,提出了RDD弹性的分布式原创 2020-09-13 23:56:48 · 481 阅读 · 1 评论 -
2020.9.2 ES健康值检查及简单的CRUD
2、ES的安装(1) 六字箴言:JDK->下载->启动->验证(2) 开发模式和生产模式3、ES-node(1)Role:节点的角色1.Master:主节点2.voting:投票 仅投票节点,需要设置:node.voting_only3.coordinating:每个节点都有协调的功能,而仅协调 node.master=false node.data=false不做数据存储的功能,只做转发(2)Node-type:节点的类型1.Master-eligible node原创 2020-09-02 19:50:29 · 1102 阅读 · 0 评论 -
2020.8.27整合SSM框架
第一步:配置pom.xml文件(将Spring、SpringMVC、mybatis的依赖全部导入进来)<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven原创 2020-08-27 22:45:28 · 217 阅读 · 0 评论 -
2020.8.24MyBatis逆向工程- MyBatis Generator(仅作了解,不推荐)
官方文档:https://mybatis.org/generator/第一步:配置Maven:pom.xml文件<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http:/原创 2020-08-24 19:52:59 · 328 阅读 · 0 评论 -
2020.8.23MyBatis的基本使用2
maven依赖:pom.xml文件<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.原创 2020-08-24 19:52:26 · 231 阅读 · 0 评论