wordcount
getlines
import scala.collection.mutable.{ArrayBuffer, ListBuffer}
import scala.io.Source
object WordCount {
def main(args: Array[String]): Unit = {
var file = Source.fromFile("F:\\asd.txt")
var first = ArrayBuffer[String]()
//返回List(asd asd asd, s d f g s, a),不加tolist就是个生成器,其实和下面循环做法是一样的
// print(file.getLines().toList)
for (line <- file.getLines()){
first += line
// println(first)
}
// println(first)
var second = first.flatMap(_.split(" "))
// println(second)
//这里用map返回的是个地址
// var second2 = first.map(_.split((" ")))
// println(second2)
var third = second.map((_,1)).groupBy(_._1).mapValues(_.size).toList
// println(third)
}
}
scalalikejdbc
pom.xml
电脑用的scala版本是2.11.8
<properties>
<scala.version>2.11.8</scala.version>
<scalikejdbc.version>3.3.1</scalikejdbc.version>
</properties>
镜像网站,下载更快
<repository>
<id>cloudera</id>
<url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
</repository>
放在dependencies里的
<dependency>
<groupId>org.scalikejdbc</groupId>
<artifactId>scalikejdbc_2.11</artifactId>
<version>${scalikejdbc.version}</version>
</dependency>
<dependency>
<groupId>org.scalikejdbc</groupId>
<artifactId>scalikejdbc-core_2.11</artifactId>
<version>${scalikejdbc.version}</version>
</dependency>
<dependency>
<groupId>org.scalikejdbc</groupId>
<artifactId>scalikejdbc-config_2.11</artifactId>
<version>${scalikejdbc.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.27</version>
</dependency>
如果使用DBs的方式去加载数据库配置,默认在这个路径下找加载文件
src/main/resources/application.conf
application.conf
db.default.driver="com.mysql.jdbc.Driver"
db.default.url="jdbc:mysql://hadoop000/ruozedb?characterEncoding=utf-8"
db.default.user="ruoze"
db.default.password="123456"
代码
import scalikejdbc._
import scalikejdbc.config._
object scalalikejdbctask {
//加载数据库配置,从src/main/resources/application.conf加载
DBs.setup()
//自动选择模式吧,全体指定,如果这里不写,要在每个sql的def里指定
implicit val session = AutoSession
//注意这里也是设置数据库的配置,和上面DBs方式2选一
// val driverClass = "com.mysql.jdbc.Driver"
// val jdbcUrl = "jdbc:mysql://192.168.137.190:3306/ruozedb";
// val username = "ruoze";
// val pwd = "123456";
// Class.forName(driverClass)
// ConnectionPool.singleton(jdbcUrl, username, pwd)
def main(args: Array[String]): Unit = {
createTable("asd")
// insertable(12,"14yhuang")
// insertable(1,2,3)
// updatable(3,"ert")
// deletetable(id = 3)
println(selectable2())
//droptable
}
//这个注意给表名传参的话,string类型带"",相当于创建表时是"table",报错
//所以要用replace去替代掉",注意直接在sql语句后面跟replace会找不到这个方法
//但是注意小写sql会出这个问题,但是大写SQL不会
def createTable(af:String): Unit = {
// var sqlcreate =
// """
// CREATE TABLE IF NOT EXISTS ${af}(
// id int PRIMARY KEY NOT NULL auto_increment,
// name varchar(64),
// created_time timestamp not null DEFAULT current_timestamp
// )ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1
// """.stripMargin.replace("\"","")
//
//
//
// sql"${sqlcreate}".execute.apply()
SQL("""
CREATE TABLE IF NOT EXISTS ${af}(
id int PRIMARY KEY NOT NULL auto_increment,
name varchar(64),
created_time timestamp not null DEFAULT current_timestamp
)ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1""").execute().apply()
// 错误事例
// sql"""
// CREATE TABLE IF NOT EXISTS (?)(
// id int PRIMARY KEY NOT NULL auto_increment,
// name varchar(64),
// created_time timestamp not null DEFAULT current_timestamp
// )ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1
// """.bind(af).execute.apply()
}
def insertable(id: Int, name: String) = {
sql"insert into asd (id,name) values(${id},${name})".update().apply()
}
def insertable(id: Int*) = {
id.foreach(
id => sql"insert into asd (id) values (${id})".update().apply()
)
}
//sql里面不能有"",会报错
def updatable(id: Int, name: String) = {
sql"update asd set name=${name} where id =${id}".execute().apply()
}
//研究发现execute和update没什么区别,execute返回时bool,update是int
def deletetable(id: Int) = {
sql"delete from asd where id=${id}".update().apply()
}
//这个sql后面不跟东西,返回的是个迭代器
def selectable() = {
//调用case class
sql"select * from asd".map(rs => toselect(rs.int("id"), rs.string("name"), rs.string("created_time"))).list().apply()
}
//注意这里因为只要一个字段,而class是3个字段,所以不写
def selectable2() = {
sql"select id from asd".map(rs => rs.int("id")).list().apply()
}
def selectable3() = {
// bind也可以指定前面?的值,single如果返回的是多行数据,那么会抛异常报错
// 这种相当于先用object,自动调用apply方法,里面的操作和上面的方式一样的
sql"select * from asd where id=(?)".bind(12).map((toselect(_))).list().single().apply()
}
//相当于模板
case class toselect(id: Int, name: String, create_time: String)
object toselect extends SQLSyntaxSupport[toselect] {
override val tableName = "toselect"
def apply(rs: WrappedResultSet) = {
new toselect(
rs.int("id"), rs.string("name"), rs.string("created_time")
)
}
}
def droptable={
sql"drop table if exists asd".update().apply()
}
}
scala生成文件
PrintWriter
Random.nextInt
StringBuilder
import java.io.{File, PrintWriter}
import scala.io.Source
import scala.util.Random
object makefile{
val urls = Array("https://www.baidu.com/",
"https://fenian7788.github.io/",
"https://me.csdn.net/weixin_39702831",
"https://blog.csdn.net/umdfml00",
"https://blog.csdn.net/Jaserok",
"https://www.jianshu.com/u/32a08e1b7af0",
"https://blog.csdn.net/Sylvia_D507",
"https://blog.csdn.net/qq_29416019",
"https://blog.csdn.net/qq_39892028",
"https://blog.csdn.net/u010854024",
"https://blog.csdn.net/qq_34382453",
"https://blog.csdn.net/weixin_42733888"
)
def generateurl()={
//左闭右开
urls(Random.nextInt(urls.length))
}
val year =Array("2011", "2012", "2013", "2014", "2015", "2016", "2017", "2018", "2019")
def main(args: Array[String]): Unit = {
//该类可用来创建一个文件并向文本文件写入数据
val writer = new PrintWriter(new File("generatefile"))
for (i <- 1 to 10){
//random.nextint是(0到值)的random
writer.println(generatefile())
}
//注意不能直接关,如果缓存区的数据没有全部写入,会丢失,这里就是强制写完
writer.flush()
//关了才能输出在控制台
writer.close()
val x = Source.fromFile("generatefile")
println(x)
}
//生成文件每一行拼凑的内容
def generatefile()={
//一种string类,效率高但线程不安全,适合单线程
val fl = new StringBuilder()
fl.append(generateurl()).append("\t").append(generatetime)
.append("\t").append(generateliuliang2(30))
// fl.toString()
}
def generateliuliang(range:Int)={
Random.nextInt(range)
}
//造数范围0到9,如果range参数的随机对3的余数为0,则造的数后面加-
def generateliuliang2(range:Int)={
if (Random.nextInt(range) % 3 ==0){
generateliuliang(10).toString + "-"
}
else {
generateliuliang(10)
}
}
def generatetime={
var date = new StringBuilder()
date.append(year(Random.nextInt(year.length))).append("-")
//至少两位整数位,不足补0
date.append("%02d".format(Random.nextInt(12)+1)).append("-")
date.append("%02d".format(Random.nextInt(30)+1))
if (Random.nextInt(30) % 4 ==0){
date.append("-")
}
date
}
}