Phoenix的安装使用与SQL查询HBase
一. Phoenix的简介
1. 什么是phoenix
现有hbase的查询工具有很多如:Hive,Tez,Impala,Shark/Spark,Phoenix等。今天主要说Phoenix。phoenix是一个在hbase上面实现的基于hadoop的OLTP技术,具有低延迟、事务性、可使用sql、提供jdbc接口的特点。 而且phoenix还提供了hbase二级索引的解决方案,丰富了hbase查询的多样性,继承了hbase海量数据快速随机查询的特点。但是在生产环境中,不可以用在OLTP中。在线事务处理的环境中,需要低延迟,而Phoenix在查询HBase时,虽然做了一些优化,但延迟还是不小。所以依然是用在OLAT中,再将结果返回存储下来。
Phoenix完全使用Java编写,作为HBase内嵌的JDBC驱动。Phoenix查询引擎会将SQL查询转换为一个或多个HBase扫描,并编排执行以生成标准的JDBC结果集。直接使用HBase API、协同处理器与自定义过滤器,对于简单查询来说,其性能量级是毫秒,对于百万级别的行数来说,其性能量级是秒。
2. phoenix的架构
3. phoenix的下载
选择对应的hbase版本进行下载,我这里使用的是hbase-1.2.6版本,下载地址:http://mirror.bit.edu.cn/apache/phoenix/
- [admin@node21 ~]$ cd /opt/software/
- [admin@node21 software]$ wget http://mirror.bit.edu.cn/apache/phoenix/apache-phoenix-4.14.0-HBase-1.2/bin/apache-phoenix-4.14.0-HBase-1.2-bin.tar.gz
- [admin@node21 software]$ ll
- -rw-rw-r-- 1 admin admin 346171547 Jun 5 06:16 apache-phoenix-4.14.0-HBase-1.2-bin.tar.gz
4. 集群部署
节点IP | 节点名称 | HBase | Phoniex | Zookeeper | Hadoop |
192.168.100.21 | node21 | √ | √ | √ | √ |
192.168.100.22 | node22 | √ | √ | √ | |
192.168.100.23 | node23 | √ | √ | √ |
Hadoop集群搭建参考: CentOS7.5搭建Hadoop2.7.6完全分布式集群
zookeeper集群搭建参考:CentOS7.5搭建Zookeeper3.4.12集群
HBase集群搭建参考: CentOS7.5搭建HBase1.2.6HA集群
二. Phoenix服务端安装
官网安装文档参考:http://phoenix.apache.org/installation.html
1. 解压缩安装包
- [admin@node21 software]$ tar zxvf apache-phoenix-4.14.0-HBase-1.2-bin.tar.gz -C /opt/module/
- [admin@node21 software]$ cd /opt/module/
- [admin@node21 module]$ mv apache-phoenix-4.14.0-HBase-1.2-bin phoenix-4.14.0-HBase-1.2
- [admin@node21 module]$ ll
- drwxr-xr-x 5 admin admin 4096 Jun 5 05:41 phoenix-4.14.0-HBase-1.2
2. 拷贝jar包到hbase/lib包
进入到phoenix的安装目录把phoenix-4.12.0-HBase-1.2-server.jar 拷贝到集群中每个节点( 主节点也要拷贝 )的 hbase 的 lib 目录下
- [admin@node21 module]$ cd phoenix-4.14.0-HBase-1.2/
- [admin@node21 phoenix-4.14.0-HBase-1.2]$ cp phoenix-4.14.0-HBase-1.2-server.jar /opt/module/hbase-1.2.6/lib/
- [admin@node21 phoenix-4.14.0-HBase-1.2]$ scp phoenix-4.14.0-HBase-1.2-server.jar admin@node22:/opt/module/hbase-1.2.6/lib/
- [admin@node21 phoenix-4.14.0-HBase-1.2]$ scp phoenix-4.14.0-HBase-1.2-server.jar admin@node23:/opt/module/hbase-1.2.6/lib/
3. 配置phoenix环境变量
- [admin@node21 phoenix-4.14.0-HBase-1.2]$ sudo vi /etc/profile
- export PHOENIX_HOME=/opt/module/phoenix-4.14.0-HBase-1.2
- export PATH=$PATH:$PHOENIX_HOME/bin
- [admin@node21 phoenix-4.14.0-HBase-1.2]$ source /etc/profile
4. 重启Hbase
- $ zkServer.sh start
- [admin@node21 ~]$ start-dfs.sh
- [admin@node22 ~]$ start-yarn.sh
- [admin@node21 ~]$ start-hbase.sh
5. 启动phoenix
启动命令:phoenix-4.14.0-HBase-1.2/bin/sqlline.py zookeeper
- [admin@node21 phoenix-4.14.0-HBase-1.2]$ ./bin/sqlline.py 192.168.100.21,192.168.100.22,192.168.100.23:2181
- Setting property: [incremental, false]
- Setting property: [isolation, TRANSACTION_READ_COMMITTED]
- issuing: !connect jdbc:phoenix:192.168.100.21,192.168.100.22,192.168.100.23:2181 none none org.apache.phoenix.jdbc.PhoenixDriver
- Connecting to jdbc:phoenix:192.168.100.21,192.168.100.22,192.168.100.23:2181
- SLF4J: Class path contains multiple SLF4J bindings.
- SLF4J: Found binding in [jar:file:/opt/module/phoenix-4.14.0-HBase-1.2/phoenix-4.14.0-HBase-1.2-client.jar!/org/slf4j/impl/StaticLoggerBinder.class]
- SLF4J: Found binding in [jar:file:/opt/module/hadoop-2.7.6/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
- SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
- 18/08/21 02:28:30 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
- Connected to: Phoenix (version 4.14)
- Driver: PhoenixEmbeddedDriver (version 4.14)
- Autocommit status: true
- Transaction isolation: TRANSACTION_READ_COMMITTED
- Building list of tables and columns for tab-completion (set fastconnect to true to skip)...
- 133/133 (100%) Done
- Done
- sqlline version 1.2.0
- 0: jdbc:phoenix:192.168.100.21,192.168.100.22>
6. 验证phoenix
1)查看所有表
输入 !tables ,查看都有哪些表。以下显示均为Phoenix系统表,系统表中维护了用户表的元数据信息。
2)退出Phoenix
输入 !exit 命令(PS:Phoenix早期版本如(2.11版本)需输入!quilt才可退出,目前高版本已改为!exit命令)
三. Phoenix基本shell命令
提示:以下,可能有部分命令在Phoenix更高版本中已失效,改为其他命令代替,请注意。
- 0: jdbc:phoenix:192.168.100.21,192.168.100.22> help
- !all Execute the specified SQL against all the current
- connections
- !autocommit Set autocommit mode on or off
- !batch Start or execute a batch of statements
- !brief Set verbose mode off
- !call Execute a callable statement
- !close Close the current connection to the database
- !closeall Close all current open connections
- !columns List all the columns for the specified table
- !commit Commit the current transaction (if autocommit is off)
- !connect Open a new connection to the database.
- !dbinfo Give metadata information about the database
- !describe Describe a table
- !dropall Drop all tables in the current database
- !exportedkeys List all the exported keys for the specified table
- !go Select the current connection
- !help Print a summary of command usage
- !history Display the command history
- !importedkeys List all the imported keys for the specified table
- !indexes List all the indexes for the specified table
- !isolation Set the transaction isolation for this connection
- !list List the current connections
- !manual Display the SQLLine manual
- !metadata Obtain metadata information
- !nativesql Show the native SQL for the specified statement
- !outputformat Set the output format for displaying results
- (table,vertical,csv,tsv,xmlattrs,xmlelements)
- !primarykeys List all the primary keys for the specified table
- !procedures List all the procedures
- !properties Connect to the database specified in the properties file(s)
- !quit Exits the program
- !reconnect Reconnect to the database
- !record Record all output to the specified file
- !rehash Fetch table and column names for command completion
- !rollback Roll back the current transaction (if autocommit is off)
- !run Run a script from the specified file
- !save Save the current variabes and aliases
- !scan Scan for installed JDBC drivers
- !script Start saving a script to a file
- !set Set a sqlline variable
- Variable Value Description
- =============== ========== ================================
- autoCommit true/false Enable/disable automatic
- transaction commit
- autoSave true/false Automatically save preferences
- color true/false Control whether color is used
- for display
- fastConnect true/false Skip building table/column list
- for tab-completion
- force true/false Continue running script even
- after errors
- headerInterval integer The interval between which
- headers are displayed
- historyFile path File in which to save command
- history. Default is
- $HOME/.sqlline/history (UNIX,
- Linux, Mac OS),
- $HOME/sqlline/history (Windows)
- incremental true/false Do not receive all rows from
- server before printing the first
- row. Uses fewer resources,
- especially for long-running
- queries, but column widths may
- be incorrect.
- isolation LEVEL Set transaction isolation level
- maxColumnWidth integer The maximum width to use when
- displaying columns
- maxHeight integer The maximum height of the
- terminal
- maxWidth integer The maximum width of the
- terminal
- numberFormat pattern Format numbers using
- DecimalFormat pattern
- outputFormat table/vertical/csv/tsv Format mode for
- result display
- propertiesFile path File from which SqlLine reads
- properties on startup; default is
- $HOME/.sqlline/sqlline.properties
- (UNIX, Linux, Mac OS),
- $HOME/sqlline/sqlline.properties
- (Windows)
- rowLimit integer Maximum number of rows returned
- from a query; zero means no
- limit
- showElapsedTime true/false Display execution time when
- verbose
- showHeader true/false Show column names in query
- results
- showNestedErrs true/false Display nested errors
- showWarnings true/false Display connection warnings
- silent true/false Be more silent
- timeout integer Query timeout in seconds; less
- than zero means no timeout
- trimScripts true/false Remove trailing spaces from
- lines read from script files
- verbose true/false Show verbose error messages and
- debug info
- !sql Execute a SQL command
- !tables List all the tables in the database
- !typeinfo Display the type map for the current connection
- !verbose Set verbose mode on
- Comments, bug reports, and patches go to ???
四. SQuirrel客户端安装
如果您更愿意使用客户端GUI与Phoenix进行交互,请下载并安装SQuirrel。由于Phoenix是一个JDBC驱动程序,因此与此类工具的集成是无缝的。通过SQuirrel,您可以在SQL选项卡中发出SQL语句(创建表,插入数据,运行查询),并在“对象”选项卡中检查表元数据(即列表,列,主键和类型)。
1. 下载SQuirrel
官网下载地址:http://squirrel-sql.sourceforge.net/
下载完成:
2. 安装Squirrel
进入到squirrel-sql-3.8.1-standard.jar所在目录,cmd,执行如下命令:
- java -jar squirrel-sql-3.8.1-standard.jar
然后,除了选择安装路径,其它的可按需选择,否则一路“next”即可。
3. 配置Squirrel客户端
(1)将服务器上Phoenix安装目录下的phoenix-4.14.0-HBase-1.2-client.jar文件,下载到Windows下squirrel-sql安装目录的lib文件夹下,并点击squirrel-sql.bat启动。
(2)添加新的驱动(Drivers -> New Driver),如下图所示:
(3)在弹出的“Add Driver”窗口中,设置Driver的“Name”为:Phoenix,“Phoenix”为:jdbc:phoenix:192.168.100.21,其中,192.168.100.21为你Phoenix服务器的地址;“ClassName”为:org.apache.phoenix.jdbc.PhoenixDriver,最终结果如下图:
参数说明:
Name:phoenix(可以填写其他名称)
ExampleURL:填写HBase集群的zookeeper集群的连接信息,这里是jdbc:phoenix:192.168.100.21:2181
Website URL:这里不填写
Java Class Path:选择phoenix-4.2.2-client.jar(是否选中无所谓,只要在Java Class Path里面就行)
Class Name:org.apache.phoenix.jdbc.PhoenixDriver
设置完成后,点击OK关闭。
(4)点击“Drivers”边上的“Alias”选项卡,和第(2)步的新建驱动一样新建Alias (Aliases -> New Aliases),在弹出的窗口中,填写Name,UserName,Password,这三项可任意填写,在Driver选项的下拉列表中查找我们刚添加的Phoenix驱动,然后点击“Test”按钮测试连接,然后点击“Connect”按钮,弹出“Connection successful”表示配置成功。结果如下图:
参数说明:
Name:phoenix(可以填写其他名称)
Driver:选择phoenix,即上一步创建的Driver
URL:这里就是HBase集群的zookeeper的连接ip和port
User Name:随便填写
Password:随便填写
点击OK按钮,关闭弹出窗口。
(5)双击新建的test Alias ,然后点击“Connect”按钮,打开SQL命令行,在“SQL”选项卡下,即可编写sql命令,新建一张person表进行测试
- create table person (id integer not null primary key,name varchar,age integer)
插入一条数据:
- upsert into person values (1,'zhangsan' ,18)
查询数据:
- select * from person
查询结果如下图所示:
(6)到Hbase Shell下去查看我们刚刚添加的数据
可以看到我们新建的person表已经添加进去了,至此squirrel也安装并配置成功了!!
注意:通过squirrel添加的表,会自动转换为大写,由于Phoenix是区分大小写的,所以在Hbase Shell下,表名都要用大写,如:desc 'PERSON',如果用desc 'person'是会报错的。
4.关联hbase已创建的视图表
创建视图表关联hbase;
create view "person" (
pk varchar primary key,
"info"."name" varchar,
"info"."age" varchar,
"info"."birthday" varchar,
"info"."company" varchar,
"address"."contry" varchar,
"address"."province" varchar,
"address"."city" varchar
) as select * from "person";
查询表
select * from "person";
删除视图表
drop view "person";
五. Phoenix的使用
1. 命令行方式
从命令行执行SQL的终端接口现在与Phoenix捆绑在一起。要启动它,请从bin目录执行以下命令:
- [admin@node21 phoenix-4.14.0-HBase-1.2]$ ./bin/sqlline.py 192.168.100.21,192.168.100.22,192.168.100.23:2181
1)建表插入数据:这里演示官方案例,安装包目录下examples包下STOCK_SYMBOL.sql 内容如下:
- CREATE TABLE IF NOT EXISTS STOCK_SYMBOL (SYMBOL VARCHAR NOT NULL PRIMARY KEY, COMPANY VARCHAR);
- UPSERT INTO STOCK_SYMBOL VALUES ('CRM','SalesForce.com');
- SELECT * FROM STOCK_SYMBOL;
要从命令行执行SQL脚本,可以包含如下所示的SQL文件参数:
- [admin@node21 phoenix-4.14.0-HBase-1.2]$ sqlline.py 192.168.100.21,192.168.100.22,192.168.100.23:2181 ./examples/STOCK_SYMBOL.sql
- Setting property: [incremental, false]
- Setting property: [isolation, TRANSACTION_READ_COMMITTED]
- Setting property: [run, ./examples/STOCK_SYMBOL.sql]
- issuing: !connect jdbc:phoenix:192.168.100.21,192.168.100.22,192.168.100.23:2181 none none org.apache.phoenix.jdbc.PhoenixDriver
- Connecting to jdbc:phoenix:192.168.100.21,192.168.100.22,192.168.100.23:2181
- SLF4J: Class path contains multiple SLF4J bindings.
- SLF4J: Found binding in [jar:file:/opt/module/phoenix-4.14.0-HBase-1.2/phoenix-4.14.0-HBase-1.2-client.jar!/org/slf4j/impl/StaticLoggerBinder.class]
- SLF4J: Found binding in [jar:file:/opt/module/hadoop-2.7.6/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
- SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
- 18/08/21 07:53:36 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
- Connected to: Phoenix (version 4.14)
- Driver: PhoenixEmbeddedDriver (version 4.14)
- Autocommit status: true
- Transaction isolation: TRANSACTION_READ_COMMITTED
- Building list of tables and columns for tab-completion (set fastconnect to true to skip)...
- 136/136 (100%) Done
- Done
- 1/4 CREATE TABLE IF NOT EXISTS STOCK_SYMBOL (SYMBOL VARCHAR NOT NULL PRIMARY KEY, COMPANY VARCHAR);
- No rows affected (3.818 seconds)
- 2/4 UPSERT INTO STOCK_SYMBOL VALUES ('CRM','SalesForce.com');
- 1 row affected (0.166 seconds)
- 3/4 SELECT * FROM STOCK_SYMBOL;
- +---------+-----------------+
- | SYMBOL | COMPANY |
- +---------+-----------------+
- | CRM | SalesForce.com |
- +---------+-----------------+
- 1 row selected (0.184 seconds)
- 4/4
- Closing: org.apache.phoenix.jdbc.PhoenixConnection
- sqlline version 1.2.0
examples/STOCK_SYMBOL.csv
- AAPL,APPLE Inc.
- CRM,SALESFORCE
- GOOG,Google
- HOG,Harlet-Davidson Inc.
- HPQ,Hewlett Packard
- INTC,Intel
- MSFT,Microsoft
- WAG,Walgreens
- WMT,Walmart
2)导入数据:此外,您可以使用bin / psql.py加载CSV数据或执行SQL脚本。例如:
- [admin@node21 phoenix-4.14.0-HBase-1.2]$ ./bin/psql.py -t STOCK_SYMBOL 192.168.100.21,192.168.100.22,192.168.100.23:2181 ./examples/STOCK_SYMBOL.csv
PS:其中 -t 后面是表名, ../examples/STOCK_SYMBOL.csv是csv数据(注意数据的分隔符需要是逗号)。
3)查询数据
- [admin@node21 phoenix-4.14.0-HBase-1.2]$ ./bin/sqlline.py 192.168.100.21,192.168.100.22,192.168.100.23:2181
- 0: jdbc:phoenix:192.168.100.21,192.168.100.22> select * from STOCK_SYMBOL;
查询总条数
2. 客户端方式
SQuirrel是用来连接Phoenix的客户端,前面已做介绍。
六. Phoenix的api操作HBase
1. 参考资料链接
常见问题参考:http://phoenix.apache.org/faq.html#What_is_the_Phoenix_JDBC_URL_syntax
帮助文档参考:https://help.aliyun.com/document_detail/69105.html?spm=a2c4g.11186623.6.591.420a48cbSK2wy8
参考文档: http://phoenix.apache.org/phoenix_spark.html
2. 开发环境准备
IDEA、jdk1.8、window10、hadoop2.7.6、hbase1.2.6、phoenix4.14.0
1、从集群拷贝以下文件:core-site.xml、hbase-site.xml、hdfs-site.xml文件放到工程src下
2、把phoenix的phoenix-4.14.0-client.jar和phoenix-core-4.14.0.jar添加到工程classpath
3、配置集群中各节点的hosts文件,把客户端的hostname:IP添加进去
4、在客户端host文件中加入集群的hostname和IP
3. 例一
- package com.xyg.phoenix;
- import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;- /**
* Author: Mr.Deng
* Date: 2018/8/25
* Desc: create table, create index, insert data, select table.
*/
public class TestPhoenixJDBC {- private static String driver = "org.apache.phoenix.jdbc.PhoenixDriver";
- public static void main(String[] args) throws SQLException {
- Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
conn = DriverManager.getConnection("jdbc:phoenix:node21,node22,node23:2181");
stmt = conn.createStatement();
stmt.execute("drop table if exists test");
stmt.execute("create table test (mykey integer not null primary key, mycolumn varchar)");
stmt.execute("create index test_idx on test(mycolumn)");
stmt.executeUpdate("upsert into test values (1,'World!')");
stmt.executeUpdate("upsert into test values (2,'Hello')");
stmt.executeUpdate("upsert into test values (3,'World!')");
conn.commit();
rs = stmt.executeQuery("select mykey from test where mycolumn='Hello'");
while (rs.next()) {
System.out.println(rs.getInt(1));
}
stmt.close();
rs.close();
conn.close();- }
- }
Phoenix的安装使用与SQL查询HBase的更多相关文章
- Phoenix实现用SQL查询HBase
博客已转移,请借一步说话,http://www.weixuehao.com/archives/111 HBase,一个NoSQL数据库,可存储大量非关系型数据. HBase,可以用HBase shel ...
- Phoenix(SQL On HBase)安装和使用报告
一.为什么使用Phoenix二.安装Phoenix2.1 兼容问题?2.2 编译CDH版本的Phoenix2.3 安装Phoenix到CDH环境中三.Phoenix的使用3.1 phoenix的4种调 ...
- Phoenix(SQL On HBase)
1.简介 Phoenix是一个HBase框架,可以通过SQL的方式来操作HBase. Phoenix是构建在HBase上的一个SQL层,是内嵌在HBase中的JDBC驱动,能够让用户使用标准的JDBC ...
- HBase的二级索引,以及phoenix的安装(需再做一次)
一:HBase的二级索引 1.讲解 uid+ts 11111_20161126111111:查询某一uid的某一个时间段内的数据 查询某一时间段内所有用户的数据:按照时间 索引表 rowkey:ts+ ...
- Phoenix(sql on hbase)简单介绍
Phoenix(sql on hbase)简单介绍 介绍: Phoenix is a SQL skin over HBase delivered as a client-embedded JDBC d ...
- 085 HBase的二级索引,以及phoenix的安装(需再做一次)
一:问题由来 1.举例 有A列与B列,分别是年龄与姓名. 如果想通过年龄查询姓名. 正常的检索是通过rowkey进行检索. 根据年龄查询rowkey,然后根据rowkey进行查找姓名. 这样的效率不高 ...
- 安装支持elasticsearch使用sql查询插件
一.ElasticSearch-SQL介绍 ElasticSearch-SQL(后续简称es-sql)是ElasticSearch的一个插件,提供了es 的类sql查询的相关接口.支持绝大多数的sql ...
- Trafodion:Transactional SQL on HBase
Trafodion: Transactional SQL on HBase HBase上实时分布式事务处理 介绍 HBase的SQL能力一直不足.Phoenix缺乏Join能力,eBay提出的kyli ...
- Centos7.5安装分布式Hadoop2.6.0+Hbase+Hive(CDH5.14.2离线安装tar包)
Tags: Hadoop Centos7.5安装分布式Hadoop2.6.0+Hbase+Hive(CDH5.14.2离线安装tar包) Centos7.5安装分布式Hadoop2.6.0+Hbase ...
随机推荐
- python 常用模块之os
1.权限判断 bool: os.access('/python/test.py',os.F_OK) #是否存在 bool: os.access('/python/test.py',os.R_OK) # ...
- java的灵魂——反射
前言:当我们在类加载的时候,除了把.class文件加载到内存,会把各个类存到各个类模板(class类型)对象上,相同的类只有一个类模板对象.连接:把类的二进制数据合并到JRE中 反射运行时探究和使用编 ...
- RabbitMQ消息队列里积压很多消息
1.场景:上千万条消息在mq里积压了几个小时了还没解决 2.解决: 1)先修复consumer的问题,确保其恢复消费速度,然后将现有cnosumer都停掉 2)新建一个topic,partition是 ...
- 【重要】Nginx模块Lua-Nginx-Module学习笔记(三)Nginx + Lua + Redis 已安装成功(非openresty 方式安装)
源码地址:https://github.com/Tinywan/Lua-Nginx-Redis 一. 目标 使用Redis做分布式缓存:使用lua API来访问redis缓存:使用nginx向客户端提 ...
- Linux命令练习.ziw
2017年1月10日, 星期二 Linux命令练习 1.统计/usr/bin/目录下的文件个数: # ls /usr/bin | wc -l 判断 /home/goldin目录是否有文件 2.取出当前 ...
- ArchLinux升级后deadbeef无法正常启动的解决办法
deadbeef是一款简约而不简单的音乐播放器, 占资源少, 支持的格式却不少. 昨天对ArchLinux进行了一次全面升级, 经历种种惊险, 终于跨越了从 glibc-2.16 到 glibc-2. ...
- C语言入门教程-(1)简介及搭建环境
1.谁适合阅读本教程 本教程可以帮助大家从零开始学习C语言,对于有一定基础的人起到夯实基本功的作用.C语言容易学习,非常适合初学者入门,而且也为以后的编程打下基础.借用一句话:“要进入编程行业高手必学 ...
- pta 一
7-1 打印沙漏 (20 分) 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数 ...
- 2019年湖南多校第一场||2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)
第一场多校就打的这么惨,只能说自己太菜了,还需继续努力啊- 题目链接: GYM链接:https://codeforces.com/gym/101933 CSU链接:http://acm.csu.edu ...
- npm_一个有意思的npm包
$ npm install yosay const yosay = require('yosay'); console.log(yosay('Hello, and welcome to my fant ...