├── com-hadoop-azkaban-demo ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── hadoop │ │ └── azkaban │ │ └── demo │ │ └── SpringBootHadoopAzkabanApplication.java │ └── resources │ └── application.yml ├── com-hadoop-elasticsearch-demo ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── hadoop │ │ └── elasticsearch │ │ ├── SpringBootHadoopElasticSearchApplication.java │ │ ├── component │ │ ├── ElasticQueryDSLTemplate.java │ │ └── SpringContextHolder.java │ │ ├── config │ │ └── RestClientConfig.java │ │ ├── factory │ │ └── ElasticRestClientFactory.java │ │ ├── index │ │ └── StockMarketInfo.java │ │ ├── response │ │ └── QueryResult.java │ │ └── service │ │ ├── StockMarketInfoService.java │ │ └── impl │ │ └── StockMarketInfoServiceImpl.java │ └── resources │ └── application.yml ├── com-hadoop-flink-demo ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── hadoop │ │ └── flink │ │ ├── SpringBootHadoopFlinkApplication.java │ │ ├── operator │ │ ├── DataStreamCoGroupOperator.java │ │ ├── DataStreamFilterOperator.java │ │ ├── DataStreamFlatMapOperator.java │ │ ├── DataStreamJoinOperator.java │ │ ├── DataStreamKeyByOperator.java │ │ ├── DataStreamMapOperator.java │ │ ├── DataStreamReduceOperator.java │ │ ├── DataStreamRichFlatMapOperator.java │ │ ├── DataStreamSideOutputOperator.java │ │ └── SplitterFlatMapOperator.java │ │ ├── pojo │ │ ├── CountWithTimestamp.java │ │ ├── SensorReading.java │ │ └── UserAction.java │ │ ├── processfunction │ │ ├── CountWithTimeoutKeyedProcessFunction.java │ │ └── DataStreamKeyedProcessFunction.java │ │ └── watermark │ │ └── WatermarkStreamingWindow.java │ └── resources │ ├── application.yml │ └── log4j.properties ├── com-hadoop-hbase-demo ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── hadoop │ │ └── hbase │ │ ├── GlobalExceptionHandler.java │ │ ├── SpringBootHadoopHBaseApplication.java │ │ ├── common │ │ ├── Result.java │ │ └── ResultUtil.java │ │ ├── component │ │ └── SpringContextHolder.java │ │ ├── config │ │ ├── HbaseConfig.java │ │ ├── HbaseProperties.java │ │ └── Swagger2Config.java │ │ ├── controller │ │ └── UserController.java │ │ ├── exception │ │ ├── CustomException.java │ │ └── EnumerationException.java │ │ ├── repository │ │ └── HBaseRepository.java │ │ └── service │ │ ├── HBaseService.java │ │ └── impl │ │ └── HBaseServiceImpl.java │ └── resources │ ├── application.yml │ └── logback-spring.xml ├── com-hadoop-hive-demo ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── hadoop │ │ └── hive │ │ ├── SpringBootHadoopHiveApplication.java │ │ ├── annotation │ │ └── LogAspect.java │ │ ├── aop │ │ └── LogAspect.java │ │ ├── common │ │ ├── DateUtil.java │ │ ├── Result.java │ │ └── ResultUtil.java │ │ ├── config │ │ ├── DataSourceProperties.java │ │ ├── HiveDruidConfig.java │ │ ├── HiveJdbcConfig.java │ │ ├── Swagger2Config.java │ │ └── WebMvcConfig.java │ │ ├── constant │ │ └── HiveSQL.java │ │ ├── controller │ │ ├── CarController.java │ │ ├── ETLJobController.java │ │ ├── EmployeeController.java │ │ ├── HiveController.java │ │ ├── LogODSController.java │ │ ├── StudentController.java │ │ └── UserAccessTimesController.java │ │ ├── entity │ │ ├── Address.java │ │ ├── BaseInfo.java │ │ ├── car │ │ │ ├── Car.java │ │ │ ├── CarBrandMonth.java │ │ │ ├── CarCityCountyDistribution.java │ │ │ ├── CarModelFuel.java │ │ │ ├── CarMonthlySales.java │ │ │ ├── CarOwnershipTypeBrand.java │ │ │ ├── CarSexRatio.java │ │ │ └── CarUsageQuantity.java │ │ ├── database │ │ │ └── TableInfo.java │ │ ├── employee │ │ │ ├── Employee.java │ │ │ └── EmployeeComplexStructure.java │ │ ├── log │ │ │ ├── EventLog.java │ │ │ └── StartLog.java │ │ ├── student │ │ │ ├── Student.java │ │ │ └── StudentHobby.java │ │ └── user │ │ │ └── UserAccessTimes.java │ │ ├── etl │ │ ├── job │ │ │ ├── FriendsJob.java │ │ │ ├── JobBeanConfig.java │ │ │ ├── WeatherJob.java │ │ │ └── WordCountJob.java │ │ ├── mapper │ │ │ ├── FriendsMapper.java │ │ │ ├── WeatherMapper.java │ │ │ └── WordCountMapper.java │ │ ├── reducer │ │ │ ├── FriendsReducer.java │ │ │ ├── WeatherReducer.java │ │ │ └── WordCountReducer.java │ │ └── schedlue │ │ │ └── JobScheduleConfig.java │ │ ├── repository │ │ ├── CarRepository.java │ │ ├── EmployeeRepository.java │ │ ├── HiveBaseJDBCTemplate.java │ │ ├── HiveRepository.java │ │ ├── StudentRepository.java │ │ └── UserAccessTimesRepository.java │ │ └── service │ │ ├── CarService.java │ │ ├── ETLService.java │ │ ├── EmployeeService.java │ │ ├── HadoopHDFSService.java │ │ ├── StudentService.java │ │ ├── UserAccessTimesService.java │ │ ├── ads │ │ ├── StartLogADSService.java │ │ └── impl │ │ │ └── StartLogADSServiceImpl.java │ │ ├── dwd │ │ ├── EventLogDWDService.java │ │ ├── StartLogDWDService.java │ │ └── impl │ │ │ ├── EventLogDWDServiceImpl.java │ │ │ └── StartLogDWDServiceImpl.java │ │ ├── dws │ │ ├── StartLogDWSService.java │ │ └── impl │ │ │ └── StartLogDWSServiceImpl.java │ │ ├── dwt │ │ ├── StartLogDWTService.java │ │ └── impl │ │ │ └── StartLogDWTServiceImpl.java │ │ ├── impl │ │ ├── CarServiceImpl.java │ │ ├── EmployeeServiceImpl.java │ │ ├── StudentServiceImpl.java │ │ └── UserAccessTimesServiceImpl.java │ │ └── ods │ │ ├── ODSService.java │ │ └── impl │ │ ├── AbstractODSService.java │ │ ├── EventLogODSServiceImpl.java │ │ └── StartLogODSServiceImpl.java │ └── resources │ ├── AzkabanJob-START-DWD-to-DWS.job │ ├── AzkabanJob-START-DWS-to-DWT.job │ ├── AzkabanJob-START-DWT-to-ADS-ActiveDevices.job │ ├── AzkabanJob-START-DWT-to-ADS-ActiveUsersLastThreeConsecutiveWeeks.job │ ├── AzkabanJob-START-DWT-to-ADS-ContinuousActiveDevices.job │ ├── AzkabanJob-START-DWT-to-ADS-DailyUserRetentionStatus.job │ ├── AzkabanJob-START-DWT-to-ADS-LostUsers.job │ ├── AzkabanJob-START-DWT-to-ADS-NumberOfNewDeviceAddedDaily.job │ ├── AzkabanJob-START-DWT-to-ADS-NumberOfSilentUsers.job │ ├── AzkabanJob-START-DWT-to-ADS-ReturningUsers.job │ ├── AzkabanJob-START-ODS-to-DWD.job │ ├── AzkabanJob-Sqoop-Hive-to-MySQL.job │ ├── Event_Log.json │ ├── Hive-DataBase-ACTIVE_BACKGROUND-DWD.sh │ ├── Hive-DataBase-ADS.sql │ ├── Hive-DataBase-BUSINESS_DATA-HDFS-to-ODS.sh │ ├── Hive-DataBase-COMMENT-DWD.sh │ ├── Hive-DataBase-DWD.sql │ ├── Hive-DataBase-DWS.sql │ ├── Hive-DataBase-DWT.sql │ ├── Hive-DataBase-EVENT-ODS-to-DWD.sh │ ├── Hive-DataBase-EVENT_START-HDFS-to-ODS.sh │ ├── Hive-DataBase-ODS.sql │ ├── Hive-DataBase-PRAISE-DWD.sh │ ├── Hive-DataBase-START-DWD-to-DWS.sh │ ├── Hive-DataBase-START-DWS-to-DWT.sh │ ├── Hive-DataBase-START-DWT-to-ADS-ActiveDevices.sh │ ├── Hive-DataBase-START-DWT-to-ADS-ActiveUsersLastThreeConsecutiveWeeks.sh │ ├── Hive-DataBase-START-DWT-to-ADS-ContinuousActiveDevices.sh │ ├── Hive-DataBase-START-DWT-to-ADS-DailyUserRetentionStatus.sh │ ├── Hive-DataBase-START-DWT-to-ADS-LostUsers.sh │ ├── Hive-DataBase-START-DWT-to-ADS-NumberOfNewDeviceAddedDaily.sh │ ├── Hive-DataBase-START-DWT-to-ADS-NumberOfSilentUsers.sh │ ├── Hive-DataBase-START-DWT-to-ADS-ReturningUsers.sh │ ├── Hive-DataBase-START-ODS-to-DWD.sh │ ├── MySQL-DataBase-ADS.sql │ ├── Sqoop-Hive-To-MySQL.sh │ ├── Start_Log.json │ ├── application-dev.yml │ ├── application-pro.yml │ ├── application.yml │ ├── azkaban-job.zip │ └── logback-spring.xml ├── com-hadoop-hive-udf ├── pom.xml └── src │ └── main │ └── java │ └── com │ └── hadoop │ └── hive │ └── udf │ ├── BaseFieldUDF.java │ └── EventJsonUDTF.java ├── com-hadoop-kafka-demo ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── hadoop │ │ └── kafka │ │ ├── SpringBootHadoopKafkaApplication.java │ │ ├── common │ │ ├── Dto2EntityUntil.java │ │ ├── KafkaUtils.java │ │ ├── Result.java │ │ ├── ResultUtil.java │ │ ├── SpringContextUtil.java │ │ └── TopicConstant.java │ │ ├── config │ │ ├── KafkaConfig.java │ │ ├── PartitionStrategyConfig.java │ │ └── Swagger2Config.java │ │ ├── consumer │ │ ├── AbstractBaseConsumer.java │ │ ├── UserLogConsumer.java │ │ └── UserOrderConsumer.java │ │ ├── container │ │ └── ThreadMessageListenerContainer.java │ │ ├── controller │ │ ├── UserLogController.java │ │ └── UserOrderController.java │ │ ├── entity │ │ └── UserOrderEntity.java │ │ ├── event │ │ ├── listener │ │ │ ├── UserOrderListener.java │ │ │ └── UserOrderListenerConfig.java │ │ ├── model │ │ │ └── UserOrderEvent.java │ │ └── publisher │ │ │ └── UserOrderPublisher.java │ │ ├── factory │ │ ├── AbstractBaseFactory.java │ │ ├── KafkaConsumerFactory.java │ │ └── KafkaProducerFactory.java │ │ ├── handler │ │ ├── KafkaConsumerResultHandler.java │ │ └── KafkaSendResultHandler.java │ │ ├── listener │ │ └── ConsumerListener.java │ │ ├── mapper │ │ └── UserOrderMapper.java │ │ ├── model │ │ ├── UserLog.java │ │ └── UserOrder.java │ │ ├── processor │ │ ├── ProcessorConfig.java │ │ ├── UserLogProcessor.java │ │ └── WordCountProcessorSupplier.java │ │ ├── producer │ │ ├── UserLogProducer.java │ │ └── UserOrderProducer.java │ │ └── service │ │ ├── UserOrderService.java │ │ └── impl │ │ └── UserOrderServiceImpl.java │ └── resources │ ├── application.yml │ ├── logback-spring.xml │ └── mapper │ └── UserOrderMapper.xml ├── com-hadoop-spark-demo ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── hadoop │ │ └── spark │ │ ├── SpringBootHadoopSparkApplication.java │ │ ├── common │ │ └── SpringContextHolder.java │ │ ├── config │ │ ├── MySQLConfig.java │ │ ├── SparkConfig.java │ │ └── SparkProperties.java │ │ ├── domain │ │ └── WordCount.java │ │ ├── job │ │ ├── AbstractSparkJob.java │ │ ├── WordCountJob.java │ │ ├── schedule │ │ │ └── JobScheduleConfig.java │ │ ├── streaming │ │ │ └── WordCountSocketJob.java │ │ └── utils │ │ │ └── SparkJobUtil.java │ │ ├── rdd │ │ ├── ActionRDD.java │ │ ├── LogRDD.java │ │ └── WordCountRDD.java │ │ ├── service │ │ └── ETLService.java │ │ └── socket │ │ └── SparkSocketServer.java │ └── resources │ ├── application.yml │ ├── jdbc.properties │ └── spark_data_demo.txt ├── com-hadoop-web-demo ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── hadoop │ │ └── web │ │ ├── SpringBootHadoopWebApplication.java │ │ ├── common │ │ ├── Result.java │ │ └── ResultUtil.java │ │ ├── config │ │ └── Swagger2Config.java │ │ ├── controller │ │ ├── BackCountController.java │ │ ├── ContinuityUVCountController.java │ │ ├── ContinuityWKCountController.java │ │ ├── NewMIDCountController.java │ │ ├── SilentCountController.java │ │ ├── UVCountController.java │ │ ├── UserRetentionDayRateController.java │ │ └── WastageCountController.java │ │ ├── entity │ │ ├── BackCount.java │ │ ├── CompositePrimaryKey.java │ │ ├── ContinuityUVCount.java │ │ ├── ContinuityWKCount.java │ │ ├── CreateDatePrimaryKey.java │ │ ├── DateTimePrimaryKey.java │ │ ├── NewMIDCount.java │ │ ├── SilentCount.java │ │ ├── UVCount.java │ │ ├── UserRetentionDayRate.java │ │ └── WastageCount.java │ │ ├── mapping │ │ ├── BackCountMapping.java │ │ ├── ContinuityUVCountMapping.java │ │ ├── ContinuityWKCountMapping.java │ │ ├── NewMIDCountMapping.java │ │ ├── SilentCountMapping.java │ │ ├── UVCountMapping.java │ │ ├── UserRetentionDayRateMapping.java │ │ └── WastageCountMapping.java │ │ ├── model │ │ ├── BackCountModel.java │ │ ├── ContinuityUVCountModel.java │ │ ├── ContinuityWKCountModel.java │ │ ├── NewMIDCountModel.java │ │ ├── SilentCountModel.java │ │ ├── UVCountModel.java │ │ ├── UserRetentionDayRateModel.java │ │ └── WastageCountModel.java │ │ ├── repository │ │ ├── BackCountJPARepository.java │ │ ├── ContinuityUVCountJPARepository.java │ │ ├── ContinuityWKCountJPARepository.java │ │ ├── JPARepository.java │ │ ├── NewMIDCountJPARepository.java │ │ ├── SilentCountJPARepository.java │ │ ├── UVCountJPARepository.java │ │ ├── UserRetentionDayRateJPARepository.java │ │ └── WastageCountJPARepository.java │ │ └── service │ │ ├── BackCountService.java │ │ ├── ContinuityUVCountService.java │ │ ├── ContinuityWKCountService.java │ │ ├── NewMIDCountService.java │ │ ├── SilentCountService.java │ │ ├── UVCountService.java │ │ ├── UserRetentionDayRateService.java │ │ ├── WastageCountService.java │ │ └── impl │ │ ├── BackCountServiceImpl.java │ │ ├── ContinuityUVCountServiceImpl.java │ │ ├── ContinuityWKCountServiceImpl.java │ │ ├── NewMIDCountServiceImpl.java │ │ ├── SilentCountServiceImpl.java │ │ ├── UVCountServiceImpl.java │ │ ├── UserRetentionDayRateServiceImpl.java │ │ └── WastageCountServiceImpl.java │ └── resources │ └── application.yml └── pom.xml /com-hadoop-azkaban-demo/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | com-bigdata-hadoop-demo 7 | org.example 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | com-hadoop-azkaban-demo 13 | com.hadoop.azkaban.demo 14 | com-hadoop-azkaban-demo 15 | 1.0-SNAPSHOT 16 | 17 | jar 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | junit 26 | junit 27 | 4.11 28 | test 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /com-hadoop-azkaban-demo/src/main/java/com/hadoop/azkaban/demo/SpringBootHadoopAzkabanApplication.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.azkaban.demo; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class SpringBootHadoopAzkabanApplication { 8 | public static void main(String[] args) { 9 | SpringApplication.run(SpringBootHadoopAzkabanApplication.class, args); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /com-hadoop-azkaban-demo/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8066 -------------------------------------------------------------------------------- /com-hadoop-elasticsearch-demo/src/main/java/com/hadoop/elasticsearch/component/SpringContextHolder.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.elasticsearch.component; 2 | 3 | 4 | import org.slf4j.Logger; 5 | import org.slf4j.LoggerFactory; 6 | import org.springframework.beans.BeansException; 7 | import org.springframework.context.ApplicationContext; 8 | import org.springframework.context.ApplicationContextAware; 9 | import org.springframework.stereotype.Component; 10 | 11 | /** 12 | * Spring的ApplicationContext的持有者,可以用静态方法的方式获取spring容器中的bean 13 | * 14 | * @author He.Yong 15 | * @since 2021-06-29 17:35:49 16 | */ 17 | @Component 18 | public class SpringContextHolder implements ApplicationContextAware { 19 | 20 | private static ApplicationContext applicationContext; 21 | 22 | private final Logger logger = LoggerFactory.getLogger(SpringContextHolder.class); 23 | 24 | @Override 25 | public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 26 | logger.info("------------>ApplicationContext正在初始化应用程序:" + applicationContext + "<------------"); 27 | SpringContextHolder.applicationContext = applicationContext; 28 | } 29 | 30 | public static ApplicationContext getApplicationContext() { 31 | if (SpringContextHolder.applicationContext == null) { 32 | throw new RuntimeException("applicaitonContext属性为null,请检查是否注入了SpringContextHolder!"); 33 | } 34 | return applicationContext; 35 | } 36 | 37 | public static T getBean(String beanName) { 38 | return (T) getApplicationContext().getBean(beanName); 39 | } 40 | 41 | public static T getBean(Class requiredType) { 42 | return getApplicationContext().getBean(requiredType); 43 | } 44 | } -------------------------------------------------------------------------------- /com-hadoop-elasticsearch-demo/src/main/java/com/hadoop/elasticsearch/index/StockMarketInfo.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.elasticsearch.index; 2 | 3 | import lombok.Data; 4 | 5 | import java.io.Serializable; 6 | 7 | /** 8 | * 股票行情数据 9 | */ 10 | @Data 11 | public class StockMarketInfo implements Serializable { 12 | 13 | private static final long serialVersionUID = 8655855566225363655L; 14 | 15 | /** 16 | * 股票代码 17 | */ 18 | private String stockCode; 19 | /** 20 | * 股票名称 21 | */ 22 | private String stockName; 23 | /** 24 | * 总市值 25 | */ 26 | private String totalMarketValue; 27 | /** 28 | * 交易日 29 | */ 30 | private String tradeDate; 31 | /** 32 | * 涨跌幅 33 | */ 34 | private String upAndDown; 35 | } 36 | -------------------------------------------------------------------------------- /com-hadoop-elasticsearch-demo/src/main/java/com/hadoop/elasticsearch/service/StockMarketInfoService.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.elasticsearch.service; 2 | 3 | /** 4 | * 股票行情数据服务 5 | * 6 | * @author He.Yong 7 | * @since 2021-06-30 14:21:28 8 | */ 9 | public interface StockMarketInfoService { 10 | 11 | } 12 | -------------------------------------------------------------------------------- /com-hadoop-elasticsearch-demo/src/main/java/com/hadoop/elasticsearch/service/impl/StockMarketInfoServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.elasticsearch.service.impl; 2 | 3 | import com.hadoop.elasticsearch.component.ElasticQueryDSLTemplate; 4 | import com.hadoop.elasticsearch.service.StockMarketInfoService; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.elasticsearch.client.RestHighLevelClient; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.stereotype.Service; 9 | 10 | @Slf4j 11 | @Service 12 | public class StockMarketInfoServiceImpl implements StockMarketInfoService { 13 | 14 | @Autowired 15 | private RestHighLevelClient restHighLevelClient; 16 | 17 | @Autowired 18 | private ElasticQueryDSLTemplate elasticQueryDSLTemplate; 19 | } 20 | -------------------------------------------------------------------------------- /com-hadoop-elasticsearch-demo/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8098 3 | 4 | elasticsearch: 5 | address: 10.2.13.6:9200,10.2.13.6:9201,10.2.13.6:9202 6 | client: 7 | schema: http 8 | connectTimeOut: 1000 9 | socketTimeOut: 30000 10 | connectionRequestTime: 500 11 | maxConnectNum: 100 12 | maxConnectPerRoute: 100 -------------------------------------------------------------------------------- /com-hadoop-flink-demo/src/main/java/com/hadoop/flink/SpringBootHadoopFlinkApplication.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.flink; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class SpringBootHadoopFlinkApplication { 8 | public static void main(String[] args) { 9 | SpringApplication.run(SpringBootHadoopFlinkApplication.class, args); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /com-hadoop-flink-demo/src/main/java/com/hadoop/flink/operator/DataStreamFilterOperator.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.flink.operator; 2 | 3 | import com.hadoop.flink.pojo.UserAction; 4 | import org.apache.flink.api.common.functions.FilterFunction; 5 | import org.apache.flink.streaming.api.datastream.DataStreamSource; 6 | import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator; 7 | import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; 8 | 9 | import java.util.Arrays; 10 | 11 | /** 12 | * Fliter: 过滤出需要的数据 13 | */ 14 | public class DataStreamFilterOperator { 15 | public static void main(String[] args) throws Exception{ 16 | 17 | StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); 18 | 19 | // 输入: 用户行为。某个用户在某个时刻点击或浏览了某个商品,以及商品的价格。 20 | DataStreamSource source = env.fromCollection(Arrays.asList( 21 | new UserAction("userID1", 1293984000L, "click", "productID1", 10.0), 22 | new UserAction("userID2", 1293984001L, "browse", "productID2", 8.0), 23 | new UserAction("userID1", 1293984002L, "click", "productID1", 10.0) 24 | )); 25 | 26 | // 过滤: 过滤出用户ID为userID1的用户行为 27 | SingleOutputStreamOperator result = source.filter(new FilterFunction() { 28 | @Override 29 | public boolean filter(UserAction value) throws Exception { 30 | return value.getUserID().equals("userID1"); 31 | } 32 | }); 33 | 34 | // 输出: 输出到控制台 35 | // UserAction(userID=userID1, eventTime=1293984002, eventType=click, productID=productID1, productPrice=10) 36 | // UserAction(userID=userID1, eventTime=1293984000, eventType=click, productID=productID1, productPrice=10) 37 | result.print("----------Filter-----------"); 38 | 39 | env.execute(); 40 | 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /com-hadoop-flink-demo/src/main/java/com/hadoop/flink/operator/SplitterFlatMapOperator.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.flink.operator; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.apache.flink.api.common.functions.FlatMapFunction; 5 | import org.apache.flink.api.java.tuple.Tuple2; 6 | import org.apache.flink.util.Collector; 7 | import org.apache.flink.util.StringUtils; 8 | 9 | /** 10 | * 通用的FlatMap操作Function 11 | */ 12 | @Slf4j 13 | public class SplitterFlatMapOperator implements FlatMapFunction> { 14 | @Override 15 | public void flatMap(String s, Collector> collector) throws Exception { 16 | 17 | if (StringUtils.isNullOrWhitespaceOnly(s)) { 18 | log.warn("----invalid line----"); 19 | return; 20 | } 21 | 22 | for (String word : s.split(" ")) { 23 | collector.collect(new Tuple2(word, 1)); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /com-hadoop-flink-demo/src/main/java/com/hadoop/flink/pojo/CountWithTimestamp.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.flink.pojo; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | @Data 8 | @AllArgsConstructor 9 | @NoArgsConstructor 10 | public class CountWithTimestamp { 11 | public String key; 12 | public long count; 13 | public long lastModified; 14 | } 15 | -------------------------------------------------------------------------------- /com-hadoop-flink-demo/src/main/java/com/hadoop/flink/pojo/SensorReading.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.flink.pojo; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | @Data 8 | @AllArgsConstructor 9 | @NoArgsConstructor 10 | public class SensorReading { 11 | /** 12 | * 传感器id 13 | */ 14 | private String id; 15 | /** 16 | * 时间戳 17 | */ 18 | private Long timestamp; 19 | /** 20 | * 温度值 21 | */ 22 | private Double temperature; 23 | 24 | } 25 | -------------------------------------------------------------------------------- /com-hadoop-flink-demo/src/main/java/com/hadoop/flink/pojo/UserAction.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.flink.pojo; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | 6 | /** 7 | * 用户行为操作 8 | */ 9 | @Data 10 | @AllArgsConstructor 11 | public class UserAction { 12 | /** 13 | * 用户ID 14 | */ 15 | private String userID; 16 | /** 17 | * 发生时间 18 | */ 19 | private Long eventTime; 20 | /** 21 | * 事件类型 22 | */ 23 | private String eventType; 24 | /** 25 | * 产品ID 26 | */ 27 | private String productID; 28 | /** 29 | * 产品价格 30 | */ 31 | private Double productPrice; 32 | } 33 | -------------------------------------------------------------------------------- /com-hadoop-flink-demo/src/main/resources/application.yml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bys-eric-he/com-hadoop-bigdata-demo/390cc4369033261c1abac8867fd59ec3f7ac2c8b/com-hadoop-flink-demo/src/main/resources/application.yml -------------------------------------------------------------------------------- /com-hadoop-flink-demo/src/main/resources/log4j.properties: -------------------------------------------------------------------------------- 1 | # This affects logging for both user code and Flink 2 | log4j.rootLogger=INFO, console 3 | 4 | # Uncomment this if you want to _only_ change Flink's logging 5 | log4j.logger.org.apache.flink=WARN 6 | 7 | # The following lines keep the log level of common libraries/connectors on 8 | # log level INFO. The root logger does not override this. You have to manually 9 | # change the log levels here. 10 | log4j.logger.akka=WARN 11 | log4j.logger.org.apache.kafka=INFO 12 | log4j.logger.org.apache.hadoop=WARN 13 | log4j.logger.org.apache.zookeeper=WARN 14 | 15 | # Log all infos to the console 16 | log4j.appender.console=org.apache.log4j.ConsoleAppender 17 | log4j.appender.console.layout=org.apache.log4j.PatternLayout 18 | log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %-60c %x - %m%n 19 | # Suppress the irrelevant (wrong) warnings from the Netty channel handler 20 | log4j.logger.org.apache.flink.shaded.akka.org.jboss.netty.channel.DefaultChannelPipeline=ERROR, console 21 | -------------------------------------------------------------------------------- /com-hadoop-hbase-demo/src/main/java/com/hadoop/hbase/SpringBootHadoopHBaseApplication.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hbase; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class SpringBootHadoopHBaseApplication { 8 | public static void main(String[] args) { 9 | SpringApplication.run(SpringBootHadoopHBaseApplication.class, args); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /com-hadoop-hbase-demo/src/main/java/com/hadoop/hbase/common/Result.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hbase.common; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * API 统一返回结果 7 | * 8 | * @param 9 | */ 10 | @Data 11 | public class Result { 12 | 13 | /** 14 | * 响应码 15 | */ 16 | private Integer resCode; 17 | 18 | /** 19 | * 错误码 20 | */ 21 | private String errCode; 22 | 23 | /** 24 | * 错误信息 25 | */ 26 | private String errMsg; 27 | 28 | /** 29 | * 数据 30 | */ 31 | private T data; 32 | 33 | public Result(Integer resCode, String errCode, String errMsg, T data) { 34 | this.resCode = resCode; 35 | this.errCode = errCode; 36 | this.errMsg = errMsg; 37 | this.data = data; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /com-hadoop-hbase-demo/src/main/java/com/hadoop/hbase/component/SpringContextHolder.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hbase.component; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | import org.springframework.beans.BeansException; 6 | import org.springframework.context.ApplicationContext; 7 | import org.springframework.context.ApplicationContextAware; 8 | import org.springframework.stereotype.Component; 9 | 10 | /** 11 | * Spring的ApplicationContext的持有者,可以用静态方法的方式获取spring容器中的bean 12 | */ 13 | @Component 14 | public class SpringContextHolder implements ApplicationContextAware { 15 | 16 | private static ApplicationContext applicationContext; 17 | 18 | private final Logger logger = LoggerFactory.getLogger(SpringContextHolder.class); 19 | 20 | @Override 21 | public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 22 | logger.info("------------>applicationContext正在初始化,application:" + applicationContext); 23 | SpringContextHolder.applicationContext = applicationContext; 24 | } 25 | 26 | public static ApplicationContext getApplicationContext() { 27 | if (SpringContextHolder.applicationContext == null) { 28 | throw new RuntimeException("applicaitonContext属性为null,请检查是否注入了SpringContextHolder!"); 29 | } 30 | return applicationContext; 31 | } 32 | 33 | public static T getBean(String beanName) { 34 | return (T) getApplicationContext().getBean(beanName); 35 | } 36 | 37 | public static T getBean(Class requiredType) { 38 | return getApplicationContext().getBean(requiredType); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /com-hadoop-hbase-demo/src/main/java/com/hadoop/hbase/config/HbaseConfig.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hbase.config; 2 | 3 | 4 | import org.apache.hadoop.hbase.HBaseConfiguration; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.beans.factory.annotation.Qualifier; 7 | import org.springframework.boot.context.properties.EnableConfigurationProperties; 8 | import org.springframework.context.annotation.Bean; 9 | import org.springframework.context.annotation.Configuration; 10 | 11 | import java.util.Map; 12 | import java.util.Set; 13 | 14 | /** 15 | * Hbase配置类 16 | * 17 | * @author heyong 18 | * @Date 2020年09月01日 19 | */ 20 | @Configuration 21 | @EnableConfigurationProperties(HbaseProperties.class) 22 | public class HbaseConfig { 23 | 24 | @Autowired 25 | private HbaseProperties properties; 26 | 27 | /** 28 | * 配置对象 29 | * 30 | * @return 31 | */ 32 | @Bean("hbaseConfiguration") 33 | @Qualifier("hbaseConfiguration") 34 | public org.apache.hadoop.conf.Configuration configuration() { 35 | org.apache.hadoop.conf.Configuration configuration = HBaseConfiguration.create(); 36 | Map config = properties.getConfig(); 37 | Set keySet = config.keySet(); 38 | for (String key : keySet) { 39 | configuration.set(key, config.get(key)); 40 | } 41 | return configuration; 42 | } 43 | } -------------------------------------------------------------------------------- /com-hadoop-hbase-demo/src/main/java/com/hadoop/hbase/config/HbaseProperties.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hbase.config; 2 | 3 | import org.springframework.boot.context.properties.ConfigurationProperties; 4 | 5 | import java.util.Map; 6 | 7 | /** 8 | * Hbase配置属性 9 | */ 10 | @ConfigurationProperties(prefix = HbaseProperties.HC, ignoreUnknownFields = false) 11 | public class HbaseProperties { 12 | final static String HC = "hbase"; 13 | private Map config; 14 | 15 | public Map getConfig() { 16 | return config; 17 | } 18 | 19 | public void setConfig(Map config) { 20 | this.config = config; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /com-hadoop-hbase-demo/src/main/java/com/hadoop/hbase/config/Swagger2Config.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hbase.config; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.web.bind.annotation.RestController; 6 | import springfox.documentation.builders.ApiInfoBuilder; 7 | import springfox.documentation.builders.PathSelectors; 8 | import springfox.documentation.builders.RequestHandlerSelectors; 9 | import springfox.documentation.service.ApiInfo; 10 | import springfox.documentation.service.Contact; 11 | import springfox.documentation.spi.DocumentationType; 12 | import springfox.documentation.spring.web.plugins.Docket; 13 | import springfox.documentation.swagger2.annotations.EnableSwagger2; 14 | 15 | import java.time.LocalDateTime; 16 | import java.util.Date; 17 | 18 | @Configuration 19 | @EnableSwagger2 20 | public class Swagger2Config { 21 | 22 | /** 23 | * Swagger组件注册 24 | */ 25 | @Bean 26 | public Docket api() { 27 | return new Docket(DocumentationType.SWAGGER_2) 28 | .apiInfo(apiInfo()) 29 | .select() 30 | .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class)) 31 | .paths(PathSelectors.any()) 32 | .build() 33 | .directModelSubstitute(LocalDateTime.class, Date.class); 34 | } 35 | 36 | private ApiInfo apiInfo() { 37 | return new ApiInfoBuilder() 38 | .title("Spring Boot For HBase Demo API V1.0") 39 | .description("Spring Boot Hadoop HBase Application") 40 | .termsOfServiceUrl("http://localhost:8088/swagger-ui.html") 41 | .contact(new Contact("he yong", "", "heyong@9fstock.com")) 42 | .version("1.0") 43 | .build(); 44 | } 45 | } -------------------------------------------------------------------------------- /com-hadoop-hbase-demo/src/main/java/com/hadoop/hbase/exception/CustomException.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hbase.exception; 2 | 3 | /** 4 | * 用户自定义异常 5 | */ 6 | public class CustomException extends Exception { 7 | 8 | private EnumerationException exception; 9 | 10 | public CustomException() { 11 | } 12 | 13 | public CustomException(EnumerationException exception) { 14 | super(exception.getMessage()); 15 | this.exception = exception; 16 | } 17 | 18 | public EnumerationException getException() { 19 | return exception; 20 | } 21 | 22 | public void setException(EnumerationException exception) { 23 | this.exception = exception; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /com-hadoop-hbase-demo/src/main/java/com/hadoop/hbase/exception/EnumerationException.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hbase.exception; 2 | 3 | /** 4 | * 异常枚举类 5 | */ 6 | public enum EnumerationException { 7 | PARAMETER_ERROR("10100", "系统异常,入参错误!"), 8 | SYSTEM_ERROR("10001", "系统异常,系统内部异常!"); 9 | 10 | private String code; 11 | private String message; 12 | 13 | private EnumerationException(String code, String message) { 14 | this.code = code; 15 | this.message = message; 16 | } 17 | 18 | public String getCode() { 19 | return code; 20 | } 21 | 22 | public void setCode(String code) { 23 | this.code = code; 24 | } 25 | 26 | public String getMessage() { 27 | return message; 28 | } 29 | 30 | public void setMessage(String message) { 31 | this.message = message; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /com-hadoop-hbase-demo/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | #Hbase数据库配置 2 | #需要在容器映射16020端口 -p 16020:16020,并将容器id 加到hosts文件中,对应宿主机IP。例如:10.1.2.168 faa5b5d021b7 3 | hbase: 4 | config: 5 | hbase.zookeeper.quorum: 10.2.13.24:2181 6 | hbase.zookeeper.property.clientPort: 2181 7 | zookeeper.znode.parent: /hbase 8 | #日志配置文件 9 | logging: 10 | config: classpath:logback-spring.xml 11 | #服务器端口号 12 | server: 13 | port: 8088 -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/SpringBootHadoopHiveApplication.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.scheduling.annotation.EnableScheduling; 6 | 7 | @EnableScheduling 8 | @SpringBootApplication 9 | public class SpringBootHadoopHiveApplication { 10 | 11 | public static void main(String[] args) { 12 | SpringApplication.run(SpringBootHadoopHiveApplication.class, args); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/annotation/LogAspect.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.annotation; 2 | 3 | import java.lang.annotation.*; 4 | 5 | /** 6 | * 日志注解,用于指定要记录日志的方法或类。 7 | */ 8 | @Retention(RetentionPolicy.RUNTIME) 9 | @Target({ElementType.TYPE, ElementType.METHOD}) 10 | @Documented 11 | public @interface LogAspect { 12 | /** 13 | * 标识日志内容 14 | * 15 | * @return 16 | */ 17 | String value() default ""; 18 | 19 | /** 20 | * 是否记录日志 21 | * 22 | * @return 23 | */ 24 | boolean isWriteLog() default true; 25 | } 26 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/aop/LogAspect.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.aop; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.aspectj.lang.ProceedingJoinPoint; 5 | import org.aspectj.lang.annotation.Around; 6 | import org.aspectj.lang.annotation.Aspect; 7 | import org.aspectj.lang.annotation.Pointcut; 8 | import org.aspectj.lang.reflect.MethodSignature; 9 | import org.springframework.stereotype.Service; 10 | 11 | import java.lang.reflect.Method; 12 | import java.util.Arrays; 13 | 14 | /** 15 | * 日志切面 16 | */ 17 | @Aspect 18 | @Service 19 | @Slf4j 20 | public class LogAspect { 21 | /** 22 | * 定义拦截规则:拦截所有@LogAspect注解的方法。 23 | */ 24 | @Pointcut("@annotation(com.hadoop.hive.annotation.LogAspect)") 25 | public void logPointcut() { 26 | } 27 | 28 | /** 29 | * 拦截器具体实现 30 | * 31 | * @param joinPoint 32 | * @return 33 | * @throws Throwable 34 | */ 35 | @Around("logPointcut()") 36 | public Object interceptor(ProceedingJoinPoint joinPoint) throws Throwable { 37 | long beginTime = System.currentTimeMillis(); 38 | log.info("------- 进入 AOP 日志切面处理 ------- "); 39 | MethodSignature signature = (MethodSignature) joinPoint.getSignature(); 40 | //获取被拦截的方法 41 | Method method = signature.getMethod(); 42 | //获取方法注解 43 | com.hadoop.hive.annotation.LogAspect logAspect = method.getAnnotation(com.hadoop.hive.annotation.LogAspect.class); 44 | 45 | String[] parameterNames = signature.getParameterNames(); 46 | 47 | if (logAspect != null && logAspect.isWriteLog()) { 48 | log.info("方法名称 -> " + logAspect.value()); 49 | log.info("参数名称 -> " + Arrays.toString(parameterNames)); 50 | log.info("参数值 -> " + Arrays.toString(joinPoint.getArgs())); 51 | } 52 | 53 | log.info("-------- 结束 AOP 日志切面处理 ------- 耗时:" + (System.currentTimeMillis() - beginTime)); 54 | 55 | return joinPoint.proceed(); 56 | } 57 | } -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/common/DateUtil.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.common; 2 | 3 | import java.time.LocalDateTime; 4 | import java.time.format.DateTimeFormatter; 5 | 6 | public class DateUtil { 7 | 8 | /** 9 | * 默认日期时间格式 10 | */ 11 | public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; 12 | /** 13 | * 默认日期格式 14 | */ 15 | public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd"; 16 | /** 17 | * 默认时间格式 18 | */ 19 | public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss"; 20 | 21 | /** 22 | * 获取当前日期格式化字符串 23 | * 24 | * @param "yyyy-MM-dd" 25 | * @return 26 | */ 27 | public static String getCurrentDateString(String format) { 28 | DateTimeFormatter dtf = DateTimeFormatter.ofPattern(format); 29 | return dtf.format(LocalDateTime.now()); 30 | } 31 | 32 | /** 33 | * 获取当前日期对象 34 | * 35 | * @return 36 | */ 37 | public static LocalDateTime getCurrentDateTime() { 38 | return LocalDateTime.now(); 39 | } 40 | 41 | /** 42 | * 获取LocalDateTime字符串 43 | * 44 | * @param dateTime 45 | * @param format "yyyy-MM-dd HH:mm:ss" 46 | * @return 47 | */ 48 | public static String getLocalDateTime(LocalDateTime dateTime, String format) { 49 | DateTimeFormatter dtf = DateTimeFormatter.ofPattern(format); 50 | return dtf.format(dateTime); 51 | } 52 | 53 | /** 54 | * 获取LocalDateTime对象 55 | * 56 | * @param datetime 57 | * @param format "yyyy-MM-dd HH:mm:ss" 58 | * @return 59 | */ 60 | public static LocalDateTime getLocalDateTimeByString(String datetime, String format) { 61 | DateTimeFormatter dtf = DateTimeFormatter.ofPattern(format); 62 | return LocalDateTime.parse(datetime, dtf); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/common/Result.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.common; 2 | 3 | 4 | import lombok.Data; 5 | 6 | /** 7 | * API 统一返回结果 8 | * 9 | * @param 10 | */ 11 | @Data 12 | public class Result { 13 | 14 | /** 15 | * 响应码 16 | */ 17 | private Integer resCode; 18 | 19 | /** 20 | * 错误码 21 | */ 22 | private String errCode; 23 | 24 | /** 25 | * 错误信息 26 | */ 27 | private String errMsg; 28 | 29 | /** 30 | * 数据 31 | */ 32 | private T data; 33 | 34 | public Result(Integer resCode, String errCode, String errMsg, T data) { 35 | this.resCode = resCode; 36 | this.errCode = errCode; 37 | this.errMsg = errMsg; 38 | this.data = data; 39 | } 40 | } -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/config/DataSourceProperties.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.config; 2 | 3 | import lombok.Data; 4 | import org.springframework.boot.context.properties.ConfigurationProperties; 5 | 6 | import java.util.Map; 7 | 8 | /** 9 | * 配置文件属性 10 | * @author heyong 11 | * @Date 2020年09月01日 12 | * 13 | */ 14 | @Data 15 | @ConfigurationProperties(prefix = DataSourceProperties.DS, ignoreUnknownFields = false) 16 | public class DataSourceProperties { 17 | final static String DS = "spring.datasource"; 18 | 19 | private Map hdfs; 20 | 21 | private Map hive; 22 | 23 | private Map pool; 24 | } -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/config/HiveJdbcConfig.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.config; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.beans.factory.annotation.Qualifier; 7 | import org.springframework.context.annotation.Bean; 8 | 9 | import org.apache.tomcat.jdbc.pool.DataSource; 10 | import org.springframework.context.annotation.Configuration; 11 | import org.springframework.jdbc.core.JdbcTemplate; 12 | 13 | @Configuration 14 | public class HiveJdbcConfig { 15 | private static Logger logger = LoggerFactory.getLogger(HiveJdbcConfig.class); 16 | 17 | @Autowired 18 | private DataSourceProperties dataSourceProperties; 19 | 20 | @Bean(name = "hiveJdbcDataSource") 21 | @Qualifier("hiveJdbcDataSource") 22 | public DataSource dataSource() { 23 | DataSource dataSource = new DataSource(); 24 | dataSource.setUrl(dataSourceProperties.getHive().get("url")); 25 | dataSource.setUsername(dataSourceProperties.getHive().get("username")); 26 | dataSource.setPassword(dataSourceProperties.getHive().get("password")); 27 | dataSource.setDriverClassName(dataSourceProperties.getHive().get("driver-class-name")); 28 | logger.debug("----------Hive 数据源注入 Successfully-----------"); 29 | return dataSource; 30 | } 31 | 32 | @Bean(name = "hiveJdbcTemplate") 33 | public JdbcTemplate hiveJdbcTemplate(@Qualifier("hiveJdbcDataSource") DataSource dataSource) { 34 | return new JdbcTemplate(dataSource); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/config/Swagger2Config.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.config; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.web.bind.annotation.RestController; 6 | import springfox.documentation.builders.ApiInfoBuilder; 7 | import springfox.documentation.builders.PathSelectors; 8 | import springfox.documentation.builders.RequestHandlerSelectors; 9 | import springfox.documentation.service.ApiInfo; 10 | import springfox.documentation.service.Contact; 11 | import springfox.documentation.spi.DocumentationType; 12 | import springfox.documentation.spring.web.plugins.Docket; 13 | import springfox.documentation.swagger2.annotations.EnableSwagger2; 14 | 15 | import java.time.LocalDateTime; 16 | import java.util.Date; 17 | 18 | @Configuration 19 | @EnableSwagger2 20 | public class Swagger2Config { 21 | 22 | /** 23 | * Swagger组件注册 24 | */ 25 | @Bean 26 | public Docket api() { 27 | return new Docket(DocumentationType.SWAGGER_2) 28 | .apiInfo(apiInfo()) 29 | .select() 30 | .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class)) 31 | .paths(PathSelectors.any()) 32 | .build() 33 | .directModelSubstitute(LocalDateTime.class, Date.class); 34 | } 35 | 36 | private ApiInfo apiInfo() { 37 | return new ApiInfoBuilder() 38 | .title("犇犇大数据仓库1.0") 39 | .description("基于Hive存储的数据仓库,实现数据分层,将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目的端的过程。") 40 | .termsOfServiceUrl("http://localhost:8089/swagger-ui.html") 41 | .contact(new Contact("何涌", "", "heyong@9fstock.com")) 42 | .version("1.0") 43 | .build(); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/controller/LogODSController.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.controller; 2 | 3 | import com.hadoop.hive.common.Result; 4 | import com.hadoop.hive.common.ResultUtil; 5 | import com.hadoop.hive.entity.log.EventLog; 6 | import com.hadoop.hive.entity.log.StartLog; 7 | import com.hadoop.hive.service.ods.ODSService; 8 | import io.swagger.annotations.Api; 9 | import io.swagger.annotations.ApiOperation; 10 | import org.springframework.beans.factory.annotation.Autowired; 11 | import org.springframework.validation.annotation.Validated; 12 | import org.springframework.web.bind.annotation.RequestMapping; 13 | import org.springframework.web.bind.annotation.RequestMethod; 14 | import org.springframework.web.bind.annotation.RestController; 15 | 16 | @Api(tags = "LogController", description = "日志ODS原始数据采集控制器") 17 | @RestController 18 | @RequestMapping("/api/v1/start-log") 19 | public class LogODSController { 20 | 21 | @Autowired 22 | private ODSService startLogODSService; 23 | 24 | @Autowired 25 | private ODSService eventLogODSService; 26 | 27 | @ApiOperation("存储启动日志ODS层原始数据") 28 | @RequestMapping(path = "/insert/start", method = RequestMethod.POST) 29 | public Result insertStart(@Validated StartLog startLog) { 30 | startLogODSService.insert(startLog); 31 | return ResultUtil.success(); 32 | } 33 | 34 | @ApiOperation("存储行为日志ODS层原始数据") 35 | @RequestMapping(path = "/insert/event", method = RequestMethod.POST) 36 | public Result insertEvent(@Validated EventLog eventLog) { 37 | eventLogODSService.insert(eventLog); 38 | return ResultUtil.success(); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/controller/UserAccessTimesController.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.controller; 2 | 3 | import com.hadoop.hive.common.Result; 4 | import com.hadoop.hive.common.ResultUtil; 5 | import com.hadoop.hive.entity.user.UserAccessTimes; 6 | import com.hadoop.hive.service.UserAccessTimesService; 7 | import io.swagger.annotations.Api; 8 | import io.swagger.annotations.ApiOperation; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.web.bind.annotation.RequestMapping; 11 | import org.springframework.web.bind.annotation.RequestMethod; 12 | import org.springframework.web.bind.annotation.RestController; 13 | 14 | import java.util.List; 15 | 16 | @Api(tags = "UserAccessTimesController", description = "用户访问次数统计") 17 | @RestController 18 | @RequestMapping("/api/v1/userAccess") 19 | public class UserAccessTimesController { 20 | 21 | @Autowired 22 | private UserAccessTimesService service; 23 | 24 | @ApiOperation("获取用户访问次数原始数据") 25 | @RequestMapping(path = "/getUserAccessTimesList", method = RequestMethod.GET) 26 | public Result> getUserAccessTimesList() { 27 | List result = service.getUserAccessTimesList(); 28 | return ResultUtil.success(result); 29 | } 30 | 31 | @ApiOperation("按用户和月份分组统计访问次数") 32 | @RequestMapping(path = "/getUserAccessTimeGroupByNameAndMonth", method = RequestMethod.GET) 33 | public Result> getUserAccessTimeGroupByNameAndMonth() { 34 | List result = service.getUserAccessTimeGroupByNameAndMonth(); 35 | return ResultUtil.success(result); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/entity/Address.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.entity; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class Address { 7 | private String street; 8 | private String city; 9 | private String state; 10 | private int zip; 11 | } 12 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/entity/BaseInfo.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.entity; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class BaseInfo { 7 | private String name; 8 | private int age; 9 | } 10 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/entity/car/CarBrandMonth.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.entity.car; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 统计不同品牌的车在每个月的销售量分布 7 | * select brand,month,count(number) as number from cars where brand !='' and month != '' group by brand,month; 8 | */ 9 | @Data 10 | public class CarBrandMonth { 11 | /** 12 | * 品牌 13 | */ 14 | private String brand; 15 | /** 16 | * 月份 17 | */ 18 | private int month; 19 | /** 20 | * 数量 21 | */ 22 | private int number; 23 | } 24 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/entity/car/CarCityCountyDistribution.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.entity.car; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 统计各市、 区县的汽车销售的分布情况 7 | * select city,county,count(number)as number from cars group by city,county; 8 | */ 9 | @Data 10 | public class CarCityCountyDistribution { 11 | /** 12 | * 市 13 | */ 14 | private String city; 15 | /** 16 | * 区、县 17 | */ 18 | private String county; 19 | /** 20 | * 数量 21 | */ 22 | private int number; 23 | } 24 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/entity/car/CarModelFuel.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.entity.car; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * 通过不同类型(品牌) 车销售情况, 来统计发动机型号和燃料种类 9 | * select brand,mold,collect_set(ftype) as fTypes,collect_set(fuel) as fuels from cars where brand is not null and brand != '' and mold is not null and mold != '' group by brand,mold; 10 | */ 11 | @Data 12 | public class CarModelFuel { 13 | /** 14 | * 品牌 15 | */ 16 | private String brand; 17 | /** 18 | * 车辆类型 19 | */ 20 | private String mold; 21 | /** 22 | * 发动机型号 23 | */ 24 | private List fTypes; 25 | /** 26 | * 燃料种类 27 | */ 28 | private List fuels; 29 | } 30 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/entity/car/CarMonthlySales.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.entity.car; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 每个月的汽车销售数量的比例 7 | * select month,round(summon/sumcount,2)as per 8 | * from (select month,count(number) as summon from cars where 9 | * month is not null group by month) as a, 10 | * (select count(number) as sumcount from cars) as b; 11 | */ 12 | @Data 13 | public class CarMonthlySales { 14 | /** 15 | * 月份 16 | */ 17 | private int month; 18 | /** 19 | * 比例 20 | */ 21 | private double per; 22 | } 23 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/entity/car/CarOwnershipTypeBrand.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.entity.car; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 统计的车的所有权、 车辆类型和品牌的分布 7 | * select ower,mold,brand,count(number) as number from cars 8 | * group by ower,mold,brand; 9 | */ 10 | @Data 11 | public class CarOwnershipTypeBrand { 12 | /** 13 | * 所有权 14 | */ 15 | private String owner; 16 | /** 17 | * 车辆类型 18 | */ 19 | private String mold; 20 | /** 21 | * 品牌 22 | */ 23 | private String brand; 24 | /** 25 | * 分布数量 26 | */ 27 | private int number; 28 | } 29 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/entity/car/CarSexRatio.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.entity.car; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 统计买车的男女比例 7 | * 以下SQL属于 hive 非等值连接, 需要设置hive为nonstrict模式 set hive.mapred.mode=nonstrict; 8 | *

9 | * select sex,round((sumsex/sumcount),2) as sexper from 10 | * (select sex,count(number) as sumsex from cars where sex!='' 11 | * group by sex) as a, 12 | * (select count(number) as sumcount from cars where sex !='') as b; 13 | */ 14 | @Data 15 | public class CarSexRatio { 16 | /** 17 | * 性别 18 | */ 19 | private String sex; 20 | /** 21 | * 性别比例 22 | */ 23 | private double sexper; 24 | } 25 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/entity/car/CarUsageQuantity.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.entity.car; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 汽车用途和数量统计 7 | * select nature,count(number) as number from cars where nature!='' group by nature; 8 | */ 9 | @Data 10 | public class CarUsageQuantity { 11 | /** 12 | * 使用性质 13 | */ 14 | private String nature; 15 | /** 16 | * 数量 17 | */ 18 | private Long number; 19 | } 20 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/entity/database/TableInfo.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.entity.database; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * Hive 数据表结构信息 7 | */ 8 | @Data 9 | public class TableInfo { 10 | /** 11 | * 字段名称 12 | */ 13 | private String columnName; 14 | /** 15 | * 字段类型 16 | */ 17 | private String columnType; 18 | /** 19 | * 字段描述 20 | */ 21 | private String columnComment; 22 | } 23 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/entity/employee/Employee.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.entity.employee; 2 | 3 | import com.hadoop.hive.entity.BaseInfo; 4 | import lombok.Data; 5 | 6 | @Data 7 | public class Employee { 8 | private int id; 9 | private BaseInfo info; 10 | } 11 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/entity/employee/EmployeeComplexStructure.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.entity.employee; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * CREATE TABLE demo_database_enterprise.employee_complex_structure(name STRING,sa1ary FLOAT,subordinates ARRAY,deductions MAP,address STRUCT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' COLLECTION ITEMS TERMINATED BY '_' MAP KEYS TERMINATED BY ':' LINES TERMINATED BY '\n'; 9 | */ 10 | @Data 11 | public class EmployeeComplexStructure { 12 | private String name; 13 | private Double sa1ary; 14 | private List subordinates; 15 | 16 | private String deductions; 17 | private String address; 18 | } 19 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/entity/log/EventLog.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.entity.log; 2 | 3 | import com.fasterxml.jackson.annotation.JsonFormat; 4 | import com.sun.istack.NotNull; 5 | import io.swagger.annotations.ApiModelProperty; 6 | import lombok.Data; 7 | import org.springframework.format.annotation.DateTimeFormat; 8 | 9 | import java.time.LocalDateTime; 10 | 11 | /** 12 | * 事件日志包 13 | */ 14 | @Data 15 | public class EventLog { 16 | /** 17 | * 日志包Json字符串 18 | */ 19 | @NotNull 20 | private String context; 21 | /** 22 | * 日志日期 23 | */ 24 | @ApiModelProperty(value = "时间格式:yyyy-MM-dd HH:mm:ss", hidden = false, notes = "格式:yyyy-MM-dd HH:mm:ss", dataType = "String") 25 | @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss") 26 | @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") 27 | private LocalDateTime dateTime; 28 | } 29 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/entity/log/StartLog.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.entity.log; 2 | 3 | 4 | import com.fasterxml.jackson.annotation.JsonFormat; 5 | import io.swagger.annotations.ApiModelProperty; 6 | import lombok.Data; 7 | import org.springframework.format.annotation.DateTimeFormat; 8 | 9 | import java.time.LocalDateTime; 10 | 11 | /** 12 | * 启动日志数据包 13 | */ 14 | @Data 15 | public class StartLog { 16 | /** 17 | * 日志包Json字符串 18 | */ 19 | private String context; 20 | /** 21 | * 日志日期 22 | */ 23 | @ApiModelProperty(value = "时间,格式:yyyy-MM-dd HH:mm:ss", hidden = false, notes = "格式:yyyy-MM-dd HH:mm:ss", dataType = "String") 24 | @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") 25 | @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") 26 | private LocalDateTime dateTime; 27 | } 28 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/entity/student/Student.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.entity.student; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | @Data 8 | @NoArgsConstructor 9 | @AllArgsConstructor 10 | public class Student { 11 | private Long id; 12 | private String name; 13 | private Double score; 14 | private int age; 15 | } 16 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/entity/student/StudentHobby.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.entity.student; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import java.util.List; 8 | 9 | @Data 10 | @NoArgsConstructor 11 | @AllArgsConstructor 12 | public class StudentHobby { 13 | private int id; 14 | private String name; 15 | private List hobby; 16 | private String add; 17 | } 18 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/entity/user/UserAccessTimes.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.entity.user; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 用户访问次数 7 | */ 8 | @Data 9 | public class UserAccessTimes { 10 | /** 11 | * 用户名 12 | */ 13 | private String username; 14 | /** 15 | * 月份 16 | */ 17 | private String month; 18 | /** 19 | * 访问次数 20 | */ 21 | private int counts; 22 | } 23 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/etl/job/JobBeanConfig.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.etl.job; 2 | 3 | import com.hadoop.hive.config.DataSourceProperties; 4 | import org.springframework.beans.factory.annotation.Autowired; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.context.annotation.Configuration; 7 | 8 | /** 9 | * 用于配置和注册带参数的Job实例到IOC中 10 | */ 11 | @Configuration 12 | public class JobBeanConfig { 13 | 14 | @Autowired 15 | private DataSourceProperties dataSourceProperties; 16 | 17 | /** 18 | * 单词统计 19 | * 20 | * @return 21 | */ 22 | @Bean("wordCountJob") 23 | public WordCountJob wordCountJob() { 24 | return new WordCountJob( 25 | WordCountJob.class.getName(), 26 | dataSourceProperties.getHdfs().get("url") + "/eric/hadoop_data/input/words.txt", 27 | dataSourceProperties.getHdfs().get("url") + "/eric/hadoop_data/output_words"); 28 | } 29 | 30 | /** 31 | * 共同好友统计 32 | * 33 | * @return 34 | */ 35 | @Bean("friendsJob") 36 | public FriendsJob friendsJob() { 37 | return new FriendsJob( 38 | FriendsJob.class.getName(), 39 | dataSourceProperties.getHdfs().get("url") + "/eric/hadoop_data/input/friends.txt", 40 | dataSourceProperties.getHdfs().get("url") + "/eric/hadoop_data/output_friends" 41 | ); 42 | } 43 | 44 | /** 45 | * 统计最高温度 46 | * 47 | * @return 48 | */ 49 | @Bean("weatherJob") 50 | public WeatherJob weatherJob() { 51 | return new WeatherJob( 52 | WeatherJob.class.getName(), 53 | dataSourceProperties.getHdfs().get("url") + "/eric/hadoop_data/input/weathers.txt", 54 | dataSourceProperties.getHdfs().get("url") + "/eric/hadoop_data/output_weathers" 55 | ); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/etl/mapper/FriendsMapper.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.etl.mapper; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.apache.hadoop.io.LongWritable; 5 | import org.apache.hadoop.io.Text; 6 | import org.apache.hadoop.mapreduce.Mapper; 7 | import org.springframework.stereotype.Component; 8 | 9 | import java.io.IOException; 10 | 11 | /** 12 | * 查找共同的好友 13 | */ 14 | @Slf4j 15 | @Component 16 | public class FriendsMapper extends Mapper { 17 | private Text k = new Text(); 18 | private Text v = new Text(); 19 | 20 | /** 21 | * 读取 friends.txt 内容格式 A:B,C,D,F,E,O 22 | * 23 | * @param key 24 | * @param value 25 | * @param context 26 | * @throws IOException 27 | * @throws InterruptedException 28 | */ 29 | @Override 30 | protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { 31 | String line = value.toString().trim(); 32 | // 根据冒号拆分 33 | String[] personFriends = line.split(":"); 34 | // 第一个为用户 35 | String person = personFriends[0]; 36 | // 第二个为好友 37 | String friends = personFriends[1]; 38 | // 好友根据逗号拆分 39 | String[] friendsList = friends.split(","); 40 | log.info("----->好友数据信息,用户->{},好友->{}", person, friends); 41 | for (String friend : friendsList) { 42 | k.set(friend); 43 | v.set(person); 44 | context.write(k, v); 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/etl/mapper/WeatherMapper.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.etl.mapper; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.apache.hadoop.io.LongWritable; 5 | import org.apache.hadoop.io.Text; 6 | import org.apache.hadoop.mapred.MapReduceBase; 7 | import org.apache.hadoop.mapred.Mapper; 8 | import org.apache.hadoop.mapred.OutputCollector; 9 | import org.apache.hadoop.mapred.Reporter; 10 | import org.springframework.stereotype.Component; 11 | 12 | import java.io.IOException; 13 | 14 | /** 15 | * 读取一年中某天的最高气温 16 | */ 17 | @Slf4j 18 | @Component 19 | public class WeatherMapper extends MapReduceBase implements Mapper { 20 | 21 | private final Text word = new Text(); 22 | 23 | @Override 24 | public void map(LongWritable key, Text value, OutputCollector output, Reporter reporter) 25 | throws IOException { 26 | // 打印输入样本: ==== Before Mapper: ==== 0,2018120715 27 | log.info("==== Before Mapper: ==== {},{}", key, value); 28 | String line = value.toString(); 29 | // 截取年份 30 | String year = line.substring(0, 4); 31 | // 截取温度 32 | int temperature = Integer.parseInt(line.substring(8)); 33 | word.set(year); 34 | output.collect(word, new LongWritable(temperature)); 35 | 36 | // 打印输出样本: ==== After Mapper: ==== 2000, 15 37 | log.info("==== After Mapper: ==== {},{}", new Text(year), new LongWritable(temperature)); 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/etl/reducer/FriendsReducer.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.etl.reducer; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.apache.hadoop.io.Text; 5 | import org.apache.hadoop.mapreduce.Reducer; 6 | import org.springframework.stereotype.Component; 7 | 8 | import java.io.IOException; 9 | 10 | /** 11 | * 获取共同好友 12 | */ 13 | @Slf4j 14 | @Component 15 | public class FriendsReducer extends Reducer { 16 | private Text k = new Text(); 17 | private Text v = new Text(); 18 | 19 | /** 20 | * 读取 FriendsMapper 输出,内容格式 B A 21 | * 22 | * @param key 23 | * @param values 24 | * @param context 25 | * @throws IOException 26 | * @throws InterruptedException 27 | */ 28 | @Override 29 | protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException { 30 | StringBuilder sb = new StringBuilder(); 31 | // 循环好友 32 | for (Text person : values) { 33 | sb.append(person).append(","); 34 | } 35 | 36 | k.set(key); 37 | v.set(sb.toString()); 38 | context.write(k, v); 39 | log.info("---->共同好友数据信息,用户->{},同时存在->{} 好友列表中!", key.toString(), sb.toString()); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/etl/reducer/WeatherReducer.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.etl.reducer; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.apache.hadoop.io.LongWritable; 5 | import org.apache.hadoop.io.Text; 6 | import org.apache.hadoop.mapred.MapReduceBase; 7 | import org.apache.hadoop.mapred.OutputCollector; 8 | import org.apache.hadoop.mapred.Reducer; 9 | import org.apache.hadoop.mapred.Reporter; 10 | import org.springframework.stereotype.Component; 11 | 12 | import java.io.IOException; 13 | import java.util.Iterator; 14 | 15 | /** 16 | * 统计一年天气最高温 17 | */ 18 | @Slf4j 19 | @Component 20 | public class WeatherReducer extends MapReduceBase implements Reducer { 21 | 22 | @Override 23 | public void reduce(Text key, Iterator values, OutputCollector output, 24 | Reporter reporter) throws IOException { 25 | long maxValue = Integer.MIN_VALUE; 26 | StringBuilder sb = new StringBuilder(); 27 | // 取values温度的最大值 28 | while (values.hasNext()) { 29 | long tmp = values.next().get(); 30 | maxValue = Math.max(maxValue, tmp); 31 | sb.append(tmp).append(", "); 32 | 33 | } 34 | // 打印样本: ==== 全年气温列表 ==== 2020, 15, 23, 99, 12, 22 35 | log.info("==== 全年气温列表 ==== {}, {}", key, sb.toString()); 36 | // 打印样本: ----年份:2020,最高温度:99 ---- 37 | log.info("----年份:{},最高温度:{} ----", key, maxValue); 38 | output.collect(key, new LongWritable(maxValue)); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/etl/reducer/WordCountReducer.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.etl.reducer; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.apache.hadoop.io.IntWritable; 5 | import org.apache.hadoop.io.Text; 6 | import org.apache.hadoop.mapreduce.Reducer; 7 | import org.springframework.stereotype.Component; 8 | 9 | import java.io.IOException; 10 | 11 | /** 12 | * 继承自Reducer类,负责重写父类Reducer中的reduce方法 13 | * 参数第一个Text表示reduce函数输入的键值对的键值类型 14 | * 参数第一个IntWritable表示reduce函数输入的键值对的值类型 15 | * 参数第二个Text表示reduce函数的键类型 16 | * 参数第二个IntWritable表示reduce函数输出键值对的值类型 17 | */ 18 | @Slf4j 19 | @Component 20 | public class WordCountReducer extends Reducer { 21 | /** 22 | * reduce函数主要负责对map函数处理之后的中间结果进行最后处理,负责聚合统计,将map函数处理完的中间结果key-value键和值的列表 23 | * 针对每个key对应的value值列表集合中的数值,进行聚合累加计算。 24 | * 参数key是map函数处理完后输出的中间结果键值对的键值 25 | * values是map函数处理完后输出的中间结果值的列表 26 | * context上MapReduce框架的上下文对象,可以存放公共类型的数据,比如reduce函数处理完成的中间结果可以保存到context上下文对象中 27 | * 由上下文再写入HDFS中 28 | * 29 | * @param key 30 | * @param values 31 | * @param context 32 | * @throws IOException 33 | * @throws InterruptedException 34 | */ 35 | @Override 36 | protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException { 37 | //初始化一个局部int型变量值为0,统计最终每个单词出现的次数 38 | int sum = 0; 39 | 40 | for (IntWritable v : values) { 41 | sum += v.get(); 42 | log.info("******* 单词:{} 次数:{} *******", key, v.get()); 43 | } 44 | //将reduce处理完的结果输出到HDFS文件系统中 45 | context.write(key, new IntWritable(sum)); 46 | 47 | log.info("-----------单词:{} 总计次数:{}----------", key, sum); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/repository/HiveBaseJDBCTemplate.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.repository; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.springframework.beans.factory.annotation.Autowired; 5 | import org.springframework.beans.factory.annotation.Qualifier; 6 | import org.springframework.jdbc.core.JdbcTemplate; 7 | 8 | import javax.sql.DataSource; 9 | 10 | /** 11 | * 注入hive数据源 12 | * 13 | * @author heyong 14 | * @Date 2020年09月01日 15 | */ 16 | @Slf4j 17 | public class HiveBaseJDBCTemplate { 18 | private JdbcTemplate jdbcTemplate; 19 | 20 | public JdbcTemplate getJdbcTemplate() { 21 | return this.jdbcTemplate; 22 | } 23 | 24 | @Autowired 25 | public void setJdbcTemplate(@Qualifier("hiveDruidDataSource") DataSource dataSource) { 26 | this.jdbcTemplate = new JdbcTemplate(dataSource); 27 | } 28 | 29 | @Autowired 30 | @Qualifier("hiveJdbcDataSource") 31 | private org.apache.tomcat.jdbc.pool.DataSource jdbcDataSource; 32 | 33 | public org.apache.tomcat.jdbc.pool.DataSource getJdbcDataSource() { 34 | return this.jdbcDataSource; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/repository/UserAccessTimesRepository.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.repository; 2 | 3 | import com.hadoop.hive.annotation.LogAspect; 4 | import com.hadoop.hive.entity.user.UserAccessTimes; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.springframework.jdbc.core.BeanPropertyRowMapper; 7 | import org.springframework.stereotype.Repository; 8 | 9 | import java.util.List; 10 | 11 | @Slf4j 12 | @Repository 13 | public class UserAccessTimesRepository extends HiveBaseJDBCTemplate { 14 | /** 15 | * 获取数据列表 16 | * 17 | * @param sql SQL指令必须要有列,且列名必须和对象中的属性保持一致,不可以select * from .....,否则BeanPropertyRowMapper无法映射到类对象中。 18 | * @return 19 | */ 20 | @LogAspect(value = "getUserAccessTimesList") 21 | public List getUserAccessTimesList(String sql) { 22 | return this.getJdbcTemplate().query(sql, new BeanPropertyRowMapper<>(UserAccessTimes.class)); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/service/CarService.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.service; 2 | 3 | import com.hadoop.hive.entity.car.*; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * 汽车销售数据统计 9 | */ 10 | public interface CarService { 11 | /** 12 | * 获取销售数据列表 13 | * 14 | * @return 15 | */ 16 | List getCarList(); 17 | 18 | /** 19 | * 统计各市、 区县的汽车销售的分布情况 20 | * 21 | * @return 22 | */ 23 | List getCarCityCountyDistribution(); 24 | 25 | /** 26 | * 汽车用途和数量统计 27 | * 28 | * @return 29 | */ 30 | List getCarUsageQuantity(); 31 | 32 | /** 33 | * 统计买车的男女比例 34 | * 35 | * @return 36 | */ 37 | List getCarGenderRatio(); 38 | 39 | /** 40 | * 通过不同类型(品牌) 车销售情况, 来统计发动机型号和燃料种类 41 | * 42 | * @return 43 | */ 44 | List getCarModelFuel(); 45 | 46 | /** 47 | * 每个月的汽车销售数量的比例 48 | * 49 | * @return 50 | */ 51 | List getCarMonthlySales(); 52 | 53 | /** 54 | * 统计的车的所有权、 车辆类型和品牌的分布 55 | * 56 | * @return 57 | */ 58 | List getCarOwnershipTypeBrand(); 59 | } 60 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/service/ETLService.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.service; 2 | 3 | public interface ETLService { 4 | /** 5 | * 执行统计语句 6 | * 7 | * @param sql 8 | */ 9 | void execute(String sql); 10 | } 11 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/service/EmployeeService.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.service; 2 | 3 | import com.hadoop.hive.entity.employee.Employee; 4 | import com.hadoop.hive.entity.employee.EmployeeComplexStructure; 5 | 6 | import java.util.List; 7 | 8 | public interface EmployeeService { 9 | /** 10 | * 获取员工记录 11 | * 12 | * @return 13 | */ 14 | List getListEmployee(); 15 | 16 | /** 17 | * 获取复杂员工记录 18 | * 19 | * @return 20 | */ 21 | List getListEmployeeComplexStructure(); 22 | 23 | /** 24 | * 查询指定条件复杂员工记录 25 | * 26 | * @param name 27 | * @param city 28 | * @return 29 | */ 30 | List getListEmployeeComplexStructureByParam(String name, String city); 31 | } 32 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/service/StudentService.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.service; 2 | 3 | import com.hadoop.hive.entity.student.Student; 4 | import com.hadoop.hive.entity.student.StudentHobby; 5 | 6 | import java.util.List; 7 | 8 | public interface StudentService { 9 | /** 10 | * 获取学生对象 11 | * 12 | * @param id 13 | * @return 14 | */ 15 | Student getLimitOne(String id); 16 | 17 | /** 18 | * 获取学生对象列表 19 | * 20 | * @return 21 | */ 22 | List getListForObject(); 23 | 24 | /** 25 | * 获取学生爱好列表 26 | * 27 | * @return 28 | */ 29 | List getListStudentHobby(); 30 | } 31 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/service/UserAccessTimesService.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.service; 2 | 3 | import com.hadoop.hive.entity.user.UserAccessTimes; 4 | 5 | import java.util.List; 6 | 7 | public interface UserAccessTimesService { 8 | 9 | /** 10 | * 获取用户访问次数原始数据列表 11 | * 12 | * @return 13 | */ 14 | List getUserAccessTimesList(); 15 | 16 | /** 17 | * 按用户和月份统计访问次数 18 | * 19 | * @return 20 | */ 21 | List getUserAccessTimeGroupByNameAndMonth(); 22 | } 23 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/service/ads/StartLogADSService.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.service.ads; 2 | 3 | import com.hadoop.hive.service.ETLService; 4 | 5 | /** 6 | * ADS层 数据应用层,为各种报表提供可视化数据 7 | */ 8 | public interface StartLogADSService extends ETLService { 9 | /** 10 | * 活跃设备数 11 | * 12 | * @param sql 13 | */ 14 | void activeDevices(String sql); 15 | 16 | /** 17 | * 连续活跃设备数 18 | * 19 | * @param sql 20 | */ 21 | void continuousActiveDevices(String sql); 22 | 23 | /** 24 | * 最近连续三周活跃用户数 25 | * 26 | * @param sql 27 | */ 28 | void threeConsecutiveWeeks(String sql); 29 | 30 | /** 31 | * 每日用户留存情况 32 | * 33 | * @param sql 34 | */ 35 | void dailyUserRetentionStatus(String sql); 36 | 37 | /** 38 | * 流失用户数 39 | * 40 | * @param sql 41 | */ 42 | void lostUsers(String sql); 43 | 44 | /** 45 | * 每日新增设备信息数量 46 | * 47 | * @param sql 48 | */ 49 | void newDeviceAddedDaily(String sql); 50 | 51 | /** 52 | * 沉默用户数 53 | * 54 | * @param sql 55 | */ 56 | void numberOfSilentUsers(String sql); 57 | 58 | /** 59 | * 本周回流用户数 60 | * 61 | * @param sql 62 | */ 63 | void returningUsers(String sql); 64 | } 65 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/service/dwd/EventLogDWDService.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.service.dwd; 2 | 3 | import com.hadoop.hive.service.ETLService; 4 | 5 | /** 6 | * DWD层 明细数据层,对ODS层进行数据清洗 7 | */ 8 | public interface EventLogDWDService extends ETLService { 9 | /** 10 | * 从事件日志中抓取评论内容 11 | * 12 | * @param sql 13 | */ 14 | void comment(String sql); 15 | 16 | /** 17 | * 从事件日志中抓取点赞内容 18 | * 19 | * @param sql 20 | */ 21 | void praise(String sql); 22 | 23 | /** 24 | * 从事件日志中抓取活跃用户内容 25 | * 26 | * @param sql 27 | */ 28 | void active(String sql); 29 | } 30 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/service/dwd/StartLogDWDService.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.service.dwd; 2 | 3 | import com.hadoop.hive.service.ETLService; 4 | 5 | /** 6 | * DWD层 明细数据层,对ODS层进行数据清洗 7 | */ 8 | public interface StartLogDWDService extends ETLService { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/service/dwd/impl/StartLogDWDServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.service.dwd.impl; 2 | 3 | import com.hadoop.hive.repository.HiveRepository; 4 | import com.hadoop.hive.service.dwd.StartLogDWDService; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.stereotype.Service; 8 | 9 | import java.util.concurrent.ExecutorService; 10 | import java.util.concurrent.Executors; 11 | 12 | @Slf4j 13 | @Service("startLogDWDService") 14 | public class StartLogDWDServiceImpl implements StartLogDWDService { 15 | @Autowired 16 | private HiveRepository hiveRepository; 17 | 18 | /** 19 | * 执行统计语句 20 | * 21 | * @param sql 22 | */ 23 | @Override 24 | public void execute(String sql) { 25 | try { 26 | log.info("--------------------开始执行 StartLog ODS To DWD Job作业----------------"); 27 | hiveRepository.execute(sql); 28 | log.info("--------------------结束执行 StartLog ODS To DWD Job作业----------------"); 29 | } catch (Exception e) { 30 | log.error("******执行作业异常->{}", e.getMessage()); 31 | e.printStackTrace(); 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/service/dws/StartLogDWSService.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.service.dws; 2 | 3 | import com.hadoop.hive.service.ETLService; 4 | 5 | /** 6 | * DWS层 服务数据层,以DWD为基础按天进行轻度汇总 7 | */ 8 | public interface StartLogDWSService extends ETLService { 9 | } 10 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/service/dws/impl/StartLogDWSServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.service.dws.impl; 2 | 3 | import com.hadoop.hive.repository.HiveRepository; 4 | import com.hadoop.hive.service.dws.StartLogDWSService; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.stereotype.Service; 8 | 9 | import java.util.concurrent.ExecutorService; 10 | import java.util.concurrent.Executors; 11 | 12 | @Slf4j 13 | @Service("startLogDWSService") 14 | public class StartLogDWSServiceImpl implements StartLogDWSService { 15 | @Autowired 16 | private HiveRepository hiveRepository; 17 | 18 | /** 19 | * 执行统计语句 20 | * 21 | * @param sql 22 | */ 23 | @Override 24 | public void execute(String sql) { 25 | try { 26 | log.info("--------------------开始执行 Start Log DWD To DWS Job 作业----------------"); 27 | hiveRepository.execute(sql); 28 | log.info("--------------------结束执行 Start Log DWD To DWS Job 作业----------------"); 29 | } catch (Exception e) { 30 | log.error("******执行作业异常->{}", e.getMessage()); 31 | e.printStackTrace(); 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/service/dwt/StartLogDWTService.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.service.dwt; 2 | 3 | import com.hadoop.hive.service.ETLService; 4 | 5 | /** 6 | * DWT层 数据主题层,以DWS层为基础按主题进行汇总 7 | */ 8 | public interface StartLogDWTService extends ETLService { 9 | } 10 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/service/dwt/impl/StartLogDWTServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.service.dwt.impl; 2 | 3 | import com.hadoop.hive.repository.HiveRepository; 4 | import com.hadoop.hive.service.dwt.StartLogDWTService; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.stereotype.Service; 8 | 9 | import java.util.concurrent.ExecutorService; 10 | import java.util.concurrent.Executors; 11 | 12 | @Slf4j 13 | @Service("startLogDWTService") 14 | public class StartLogDWTServiceImpl implements StartLogDWTService { 15 | @Autowired 16 | private HiveRepository hiveRepository; 17 | 18 | /** 19 | * 执行统计语句 20 | * 21 | * @param sql 22 | */ 23 | @Override 24 | public void execute(String sql) { 25 | try { 26 | log.info("--------------------开始执行 >Start Log DWS To DWT Job 作业----------------"); 27 | hiveRepository.execute(sql); 28 | log.info("--------------------结束执行 >Start Log DWS To DWT Job 作业----------------"); 29 | } catch (Exception e) { 30 | log.error("******执行作业异常->{}", e.getMessage()); 31 | e.printStackTrace(); 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/service/impl/EmployeeServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.service.impl; 2 | 3 | import com.hadoop.hive.entity.employee.Employee; 4 | import com.hadoop.hive.entity.employee.EmployeeComplexStructure; 5 | import com.hadoop.hive.repository.EmployeeRepository; 6 | import com.hadoop.hive.service.EmployeeService; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.stereotype.Service; 9 | 10 | import java.util.List; 11 | 12 | @Service 13 | public class EmployeeServiceImpl implements EmployeeService { 14 | 15 | @Autowired 16 | private EmployeeRepository employeeRepository; 17 | 18 | /** 19 | * 获取员工记录 20 | * 21 | * @return 22 | */ 23 | @Override 24 | public List getListEmployee() { 25 | String sql = "select id,info from employee"; 26 | return employeeRepository.getListEmployee(sql); 27 | } 28 | 29 | /** 30 | * 获取复杂员工记录 31 | * 32 | * @return 33 | */ 34 | @Override 35 | public List getListEmployeeComplexStructure() { 36 | String sql = "select name,sa1ary,subordinates,deductions,address from employee_complex_structure"; 37 | return employeeRepository.getListEmployeeComplexStructure(sql); 38 | } 39 | 40 | /** 41 | * 查询指定条件复杂员工记录 42 | * 43 | * @param name 44 | * @param city 45 | * @return 46 | */ 47 | @Override 48 | public List getListEmployeeComplexStructureByParam(String name, String city) { 49 | String sql = "select name,sa1ary,subordinates,deductions,address from employee_complex_structure where 1=1 "; 50 | return employeeRepository.getListEmployeeComplexStructureByParam(sql, name, city); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/service/impl/StudentServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.service.impl; 2 | 3 | import com.hadoop.hive.entity.student.Student; 4 | import com.hadoop.hive.entity.student.StudentHobby; 5 | import com.hadoop.hive.repository.StudentRepository; 6 | import com.hadoop.hive.service.StudentService; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.stereotype.Service; 9 | 10 | import java.util.List; 11 | 12 | @Service 13 | public class StudentServiceImpl implements StudentService { 14 | 15 | @Autowired 16 | private StudentRepository studentRepository; 17 | 18 | /** 19 | * 获取学生对象 20 | * 21 | * @param id 22 | * @return 23 | */ 24 | @Override 25 | public Student getLimitOne(String id) { 26 | String sql = "select id,name,score,age from student where id ='" + id + "'"; 27 | return studentRepository.getLimitOne(sql); 28 | } 29 | 30 | /** 31 | * 获取学生对象列表 32 | * 33 | * @return 34 | */ 35 | @Override 36 | public List getListForObject() { 37 | String sql = "select id,name,score,age from student"; 38 | return studentRepository.getListForObject(sql); 39 | } 40 | 41 | /** 42 | * 获取学生爱好列表 43 | * 44 | * @return 45 | */ 46 | @Override 47 | public List getListStudentHobby() { 48 | String sql = "select id,name,hobby,add from student"; 49 | return studentRepository.getListStudentHobby(sql); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/service/impl/UserAccessTimesServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.service.impl; 2 | 3 | import com.hadoop.hive.entity.user.UserAccessTimes; 4 | import com.hadoop.hive.repository.UserAccessTimesRepository; 5 | import com.hadoop.hive.service.UserAccessTimesService; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.stereotype.Service; 9 | 10 | import java.util.List; 11 | 12 | @Slf4j 13 | @Service 14 | public class UserAccessTimesServiceImpl implements UserAccessTimesService { 15 | 16 | @Autowired 17 | private UserAccessTimesRepository repository; 18 | 19 | /** 20 | * 获取用户访问次数原始数据列表 21 | * 22 | * @return 23 | */ 24 | @Override 25 | public List getUserAccessTimesList() { 26 | String sql = "select username,month,counts from user_access_times"; 27 | return repository.getUserAccessTimesList(sql); 28 | } 29 | 30 | /** 31 | * 按用户和月份统计访问次数 32 | * 33 | * @return 34 | */ 35 | @Override 36 | public List getUserAccessTimeGroupByNameAndMonth() { 37 | String sql = "select username,substr(month,1,7) as month,sum(counts) from user_access_times group by username,substr(month,1,7)"; 38 | return repository.getUserAccessTimesList(sql); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/service/ods/ODSService.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.service.ods; 2 | 3 | /** 4 | * 日志ODS原始层服务 5 | */ 6 | public interface ODSService { 7 | /** 8 | * 保存日志包原始数据 9 | * 10 | * @param t 11 | */ 12 | void insert(T t); 13 | } 14 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/service/ods/impl/AbstractODSService.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.service.ods.impl; 2 | 3 | import com.hadoop.hive.repository.HiveRepository; 4 | import com.hadoop.hive.service.ods.ODSService; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | 8 | import java.util.concurrent.ExecutorService; 9 | import java.util.concurrent.Executors; 10 | 11 | @Slf4j 12 | public abstract class AbstractODSService implements ODSService { 13 | 14 | @Autowired 15 | private HiveRepository hiveRepository; 16 | 17 | protected abstract String takeContext(T t); 18 | 19 | /** 20 | * 保存日志包原始数据 21 | * 22 | * @param t 23 | */ 24 | @Override 25 | public void insert(T t) { 26 | ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); 27 | cachedThreadPool.execute(() -> { 28 | try { 29 | log.info("---------------接收到原始数据--------------"); 30 | String sql = this.takeContext(t); 31 | hiveRepository.insertIntoTable(sql); 32 | log.info("---------------原始数据处理结束--------------"); 33 | } catch (Exception e) { 34 | log.error("******执行原始数据作业异常->{}", e.getMessage()); 35 | e.printStackTrace(); 36 | } 37 | }); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/service/ods/impl/EventLogODSServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.service.ods.impl; 2 | 3 | import com.hadoop.hive.common.DateUtil; 4 | import com.hadoop.hive.entity.log.EventLog; 5 | import org.springframework.stereotype.Service; 6 | 7 | @Service 8 | public class EventLogODSServiceImpl extends AbstractODSService { 9 | 10 | @Override 11 | protected String takeContext(EventLog startLog) { 12 | return String.format("INSERT OVERWRITE TABLE ods_event_log PARTITION (dt = '%s')" + 13 | "SELECT '%s'", 14 | DateUtil.getLocalDateTime(startLog.getDateTime(), DateUtil.DEFAULT_DATE_FORMAT), 15 | DateUtil.getLocalDateTime(startLog.getDateTime(), DateUtil.DEFAULT_DATE_TIME_FORMAT) + "%" + startLog.getContext()); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/java/com/hadoop/hive/service/ods/impl/StartLogODSServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.hive.service.ods.impl; 2 | 3 | import com.hadoop.hive.common.DateUtil; 4 | import com.hadoop.hive.entity.log.StartLog; 5 | import org.springframework.stereotype.Service; 6 | 7 | /** 8 | * 启动日志原始数据 9 | */ 10 | @Service 11 | public class StartLogODSServiceImpl extends AbstractODSService { 12 | 13 | @Override 14 | protected String takeContext(StartLog startLog) { 15 | return String.format("INSERT OVERWRITE TABLE ods_start_log PARTITION (dt = '%s')" + 16 | "SELECT '%s'", DateUtil.getLocalDateTime(startLog.getDateTime(), DateUtil.DEFAULT_DATE_FORMAT), startLog.getContext()); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/resources/AzkabanJob-START-DWD-to-DWS.job: -------------------------------------------------------------------------------- 1 | type=command 2 | 3 | echo "--------------Start to Execute DWD To DWS For Start Log Action-----------------" 4 | echo "-----------API-> http://172.12.0.7:8089/api/v1/etl/dws/startLog--------" 5 | 6 | command=curl -X GET "http://172.12.0.7:8089/api/v1/etl/dws/startLog" -H "accept: */*" 7 | 8 | echo "--------------End to Execute DWD To DWS For Start Log Action-----------------" 9 | 10 | dependencies=AzkabanJob-START-ODS-to-DWD -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/resources/AzkabanJob-START-DWS-to-DWT.job: -------------------------------------------------------------------------------- 1 | type=command 2 | 3 | echo "--------------Start to Execute DWS To DWT For Start Log Action-----------------" 4 | echo "-----------API-> http://172.12.0.7:8089/api/v1/etl/dwt/startLog--------" 5 | 6 | command=curl -X GET "http://172.12.0.7:8089/api/v1/etl/dwt/startLog" -H "accept: */*" 7 | 8 | echo "--------------End to Execute DWS To DWT For Start Log Action-----------------" 9 | 10 | dependencies=AzkabanJob-START-DWD-to-DWS -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/resources/AzkabanJob-START-DWT-to-ADS-ActiveDevices.job: -------------------------------------------------------------------------------- 1 | type=command 2 | 3 | echo "--------------Start to Execute DWT To ADS For Active Devices Action-----------------" 4 | echo "-----------API-> http://172.12.0.7:8089/api/v1/etl/ads/activeDevices--------" 5 | 6 | command=curl -X GET "http://172.12.0.7:8089/api/v1/etl/ads/activeDevices" -H "accept: */*" 7 | 8 | echo "--------------End to Execute DWT To ADS For Active Devices Action-----------------" 9 | 10 | dependencies=AzkabanJob-START-DWS-to-DWT -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/resources/AzkabanJob-START-DWT-to-ADS-ActiveUsersLastThreeConsecutiveWeeks.job: -------------------------------------------------------------------------------- 1 | type=command 2 | 3 | echo "--------------Start to Execute DWT To ADS For Active Users Last Three Consecutive Weeks Action-----------------" 4 | echo "-----------API-> http://172.12.0.7:8089/api/v1/etl/ads/threeConsecutiveWeeks--------" 5 | 6 | command=curl -X GET "http://172.12.0.7:8089/api/v1/etl/ads/threeConsecutiveWeeks" -H "accept: */*" 7 | 8 | echo "--------------End to Execute DWT To ADS For Active Users Last Three Consecutive Weeks Action-----------------" 9 | 10 | dependencies=AzkabanJob-START-DWS-to-DWT -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/resources/AzkabanJob-START-DWT-to-ADS-ContinuousActiveDevices.job: -------------------------------------------------------------------------------- 1 | type=command 2 | 3 | echo "--------------Start to Execute DWT To ADS For Continuous Active Devices Action-----------------" 4 | echo "-----------API-> http://172.12.0.7:8089/api/v1/etl/ads/continuousActiveDevices--------" 5 | 6 | command=curl -X GET "http://172.12.0.7:8089/api/v1/etl/ads/continuousActiveDevices" -H "accept: */*" 7 | 8 | echo "--------------End to Execute DWT To ADS For Continuous Active Devices Action-----------------" 9 | 10 | dependencies=AzkabanJob-START-DWS-to-DWT -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/resources/AzkabanJob-START-DWT-to-ADS-DailyUserRetentionStatus.job: -------------------------------------------------------------------------------- 1 | type=command 2 | 3 | echo "--------------Start to Execute DWT To ADS For Daily User Retention Status Action-----------------" 4 | echo "-----------API-> http://172.12.0.7:8089/api/v1/etl/ads/dailyUserRetentionStatus--------" 5 | 6 | command=curl -X GET "http://172.12.0.7:8089/api/v1/etl/ads/dailyUserRetentionStatus" -H "accept: */*" 7 | 8 | echo "--------------End to Execute DWT To ADS For Daily User Retention Status Action-----------------" 9 | 10 | dependencies=AzkabanJob-START-DWS-to-DWT -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/resources/AzkabanJob-START-DWT-to-ADS-LostUsers.job: -------------------------------------------------------------------------------- 1 | type=command 2 | 3 | echo "--------------Start to Execute DWT To ADS For Lost Users Action-----------------" 4 | echo "-----------API-> http://172.12.0.7:8089/api/v1/etl/ads/lostUsers--------" 5 | 6 | command=curl -X GET "http://172.12.0.7:8089/api/v1/etl/ads/lostUsers" -H "accept: */*" 7 | 8 | echo "--------------End to Execute DWT To ADS For Lost Users Action-----------------" 9 | 10 | dependencies=AzkabanJob-START-DWS-to-DWT -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/resources/AzkabanJob-START-DWT-to-ADS-NumberOfNewDeviceAddedDaily.job: -------------------------------------------------------------------------------- 1 | type=command 2 | 3 | echo "--------------Start to Execute DWT To ADS For Number Of New Device Added Daily Action-----------------" 4 | echo "-----------API-> http://172.12.0.7:8089/api/v1/etl/ads/newDeviceAddedDaily--------" 5 | 6 | command=curl -X GET "http://172.12.0.7:8089/api/v1/etl/ads/newDeviceAddedDaily" -H "accept: */*" 7 | 8 | echo "--------------End to Execute DWT To ADS For Number Of New Device Added Daily Action-----------------" 9 | 10 | dependencies=AzkabanJob-START-DWS-to-DWT -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/resources/AzkabanJob-START-DWT-to-ADS-NumberOfSilentUsers.job: -------------------------------------------------------------------------------- 1 | type=command 2 | 3 | echo "--------------Start to Execute DWT To ADS For Number Of Silent Users Action-----------------" 4 | echo "-----------API-> http://172.12.0.7:8089/api/v1/etl/ads/numberOfSilentUsers--------" 5 | 6 | command=curl -X GET "http://172.12.0.7:8089/api/v1/etl/ads/numberOfSilentUsers" -H "accept: */*" 7 | 8 | echo "--------------End to Execute DWT To ADS For Number Of Silent Users Action-----------------" 9 | 10 | dependencies=AzkabanJob-START-DWS-to-DWT -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/resources/AzkabanJob-START-DWT-to-ADS-ReturningUsers.job: -------------------------------------------------------------------------------- 1 | type=command 2 | 3 | echo "--------------Start to Execute DWT To ADS For Number Of Returning Users Action-----------------" 4 | echo "-----------API-> http://172.12.0.7:8089/api/v1/etl/ads/returningUsers--------" 5 | 6 | command=curl -X GET "http://172.12.0.7:8089/api/v1/etl/ads/returningUsers" -H "accept: */*" 7 | 8 | echo "--------------End to Execute DWT To ADS For Number Of Returning Users Action-----------------" 9 | 10 | dependencies=AzkabanJob-START-DWS-to-DWT -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/resources/AzkabanJob-START-ODS-to-DWD.job: -------------------------------------------------------------------------------- 1 | type=command 2 | 3 | echo "--------------Start to Execute ODS To DWD For Start Log Action-----------------" 4 | echo "-----------API-> http://172.12.0.7:8089/api/v1/etl/dwd/startLog--------" 5 | 6 | command=curl -X GET "http://172.12.0.7:8089/api/v1/etl/dwd/startLog" -H "accept: */*" 7 | 8 | echo "--------------End to Execute ODS To DWD For Start Log Action-----------------" -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/resources/AzkabanJob-Sqoop-Hive-to-MySQL.job: -------------------------------------------------------------------------------- 1 | type=command 2 | 3 | echo "--------------Start to Execute Sqoop Hive To MySQL Action-----------------" 4 | 5 | echo "sh /usr/local/sqoop-1.4.7/Sqoop-Hive-To-MySQL.sh" 6 | 7 | command:sh /usr/local/Sqoop-Hive-To-MySQL.sh 8 | 9 | echo "--------------End to Execute Sqoop Hive To MySQL Action-----------------" 10 | 11 | dependencies=AzkabanJob-START-DWT-to-ADS-ActiveDevices,AzkabanJob-START-DWT-to-ADS-ActiveUsersLastThreeConsecutiveWeeks,AzkabanJob-START-DWT-to-ADS-ContinuousActiveDevices,AzkabanJob-START-DWT-to-ADS-DailyUserRetentionStatus,AzkabanJob-START-DWT-to-ADS-LostUsers,AzkabanJob-START-DWT-to-ADS-NumberOfNewDeviceAddedDaily,AzkabanJob-START-DWT-to-ADS-NumberOfSilentUsers,AzkabanJob-START-DWT-to-ADS-ReturningUsers -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/resources/Hive-DataBase-ACTIVE_BACKGROUND-DWD.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 数据库名称 3 | APP=demo_database_gmall 4 | 5 | # hive目录 6 | hive=/usr/local/hive-2.3.7/bin/hive 7 | 8 | # 如果是输入的日期按照取输入日期;如果没输入日期取当前时间的前一天 9 | if [ -n "$1" ]; then 10 | do_date=$1 11 | else 12 | do_date=$(date -d "-1 day" +%F) 13 | fi 14 | 15 | sql=" 16 | INSERT overwrite TABLE ${APP}.dwd_active_background_log PARTITION (dt = '$do_date') SELECT 17 | mid_id, 18 | user_id, 19 | version_code, 20 | version_name, 21 | lang, 22 | source, 23 | os, 24 | area, 25 | model, 26 | brand, 27 | sdk_version, 28 | gmail, 29 | height_width, 30 | app_time, 31 | network, 32 | lng, 33 | lat, 34 | get_json_object(event_json,'$.kv.active_source') active_source, 35 | server_time 36 | FROM 37 | ${APP}.dwd_base_event_log 38 | WHERE 39 | dt = '$do_date' 40 | AND event_name = 'active_background';" 41 | 42 | echo "===开始从事件明细中提取日期为 $do_date 的活跃用户数据===" 43 | $hive -e "$sql" 44 | echo "===从事件明细中提取日期为 $do_date 的活跃用户数据完成===" 45 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/resources/Hive-DataBase-COMMENT-DWD.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 数据库名称 3 | APP=demo_database_gmall 4 | 5 | # hive目录 6 | hive=/usr/local/hive-2.3.7/bin/hive 7 | 8 | # 如果是输入的日期按照取输入日期;如果没输入日期取当前时间的前一天 9 | if [ -n "$1" ]; then 10 | do_date=$1 11 | else 12 | do_date=$(date -d "-1 day" +%F) 13 | fi 14 | 15 | sql=" 16 | INSERT overwrite TABLE ${APP}.dwd_comment_log PARTITION (dt = '$do_date') SELECT 17 | mid_id, 18 | user_id, 19 | version_code, 20 | version_name, 21 | lang, 22 | source, 23 | os, 24 | area, 25 | model, 26 | brand, 27 | sdk_version, 28 | gmail, 29 | height_width, 30 | app_time, 31 | network, 32 | lng, 33 | lat, 34 | get_json_object(event_json,'$.kv.comment_id') comment_id, 35 | get_json_object(event_json,'$.kv.userid') userid, 36 | get_json_object(event_json,'$.kv.p_comment_id') p_comment_id, 37 | get_json_object(event_json,'$.kv.content') content, 38 | get_json_object(event_json,'$.kv.addtime') addtime, 39 | get_json_object(event_json,'$.kv.other_id') other_id, 40 | get_json_object(event_json,'$.kv.praise_count') praise_count, 41 | get_json_object(event_json,'$.kv.reply_count') reply_count, 42 | server_time 43 | FROM 44 | ${APP}.dwd_base_event_log 45 | WHERE 46 | dt = '$do_date' 47 | AND event_name = 'comment';" 48 | 49 | echo "===开始从事件明细中提取日期为 $do_date 的评论数据===" 50 | $hive -e "$sql" 51 | echo "===从事件明细中提取日期为 $do_date 的评论数据完成===" 52 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/resources/Hive-DataBase-EVENT-ODS-to-DWD.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 数据库名称 3 | APP=demo_database_gmall 4 | 5 | # hive目录 6 | hive=/usr/local/hive-2.3.7/bin/hive 7 | 8 | # 如果是输入的日期按照取输入日期;如果没输入日期取当前时间的前一天 9 | if [ -n "$1" ]; then 10 | do_date=$1 11 | else 12 | do_date=$(date -d "-1 day" +%F) 13 | fi 14 | 15 | sql=" use demo_database_gmall; 16 | insert overwrite table ${APP}.dwd_base_event_log 17 | PARTITION(dt='$do_date') 18 | select 19 | base_analizer(line,'mid') as mid_id, 20 | base_analizer(line,'uid') as user_id, 21 | base_analizer(line,'vc') as version_code, 22 | base_analizer(line,'vn') as version_name, 23 | base_analizer(line,'l') as lang, 24 | base_analizer(line,'sr') as source, 25 | base_analizer(line,'os') as os, 26 | base_analizer(line,'ar') as area, 27 | base_analizer(line,'md') as model, 28 | base_analizer(line,'ba') as brand, 29 | base_analizer(line,'sv') as sdk_version, 30 | base_analizer(line,'g') as gmail, 31 | base_analizer(line,'hw') as height_width, 32 | base_analizer(line,'t') as app_time, 33 | base_analizer(line,'nw') as network, 34 | base_analizer(line,'ln') as lng, 35 | base_analizer(line,'la') as lat, 36 | event_name, 37 | event_json, 38 | base_analizer(line,'st') as server_time 39 | from ${APP}.ods_event_log lateral view flat_analizer(base_analizer(line,'et')) tem_flat as event_name,event_json 40 | where dt='$do_date' 41 | and base_analizer(line,'et')<>''; " 42 | 43 | echo "===开始清洗事件日期为 $do_date 的数据===" 44 | $hive -e "$sql" 45 | echo "===事件日期为 $do_date 的数据清洗完成===" 46 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/resources/Hive-DataBase-EVENT_START-HDFS-to-ODS.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 数据库名称 3 | APP=demo_database_gmall 4 | 5 | # hive目录 6 | hive=/usr/local/hive-2.3.7/bin/hive 7 | 8 | # [ -n 变量值 ] 判断变量的值,是否为空 9 | # 如果是输入的日期按照取输入日期;如果没输入日期取当前时间的前一天 10 | if [ -n "$1" ]; then 11 | do_date=$1 12 | else 13 | do_date=$(date -d "-1 day" +%F) 14 | fi 15 | 16 | 17 | sql=" 18 | load data inpath '/eric/hive_data/$do_date/start_log.txt' overwrite into table ${APP}.ods_start_log partition(dt='$do_date'); 19 | load data inpath '/eric/hive_data/$do_date/event_log.txt' overwrite into table ${APP}.ods_event_log partition(dt='$do_date'); " 20 | 21 | echo "===开始导入日志日期为 $do_date 的数据===" 22 | 23 | $hive -e "$sql" 24 | 25 | echo "===日志日期为 $do_date 的数据导入完成===" 26 | 27 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/resources/Hive-DataBase-PRAISE-DWD.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 数据库名称 3 | APP=demo_database_gmall 4 | 5 | # hive目录 6 | hive=/usr/local/hive-2.3.7/bin/hive 7 | 8 | # 如果是输入的日期按照取输入日期;如果没输入日期取当前时间的前一天 9 | if [ -n "$1" ]; then 10 | do_date=$1 11 | else 12 | do_date=$(date -d "-1 day" +%F) 13 | fi 14 | 15 | sql=" 16 | 17 | INSERT overwrite TABLE ${APP}.dwd_praise_log PARTITION (dt = '$do_date') SELECT 18 | mid_id, 19 | user_id, 20 | version_code, 21 | version_name, 22 | lang, 23 | source, 24 | os, 25 | area, 26 | model, 27 | brand, 28 | sdk_version, 29 | gmail, 30 | height_width, 31 | app_time, 32 | network, 33 | lng, 34 | lat, 35 | get_json_object(event_json,'$.kv.id') id, 36 | get_json_object(event_json,'$.kv.userid') userid, 37 | get_json_object(event_json,'$.kv.target_id') target_id, 38 | get_json_object(event_json,'$.kv.type') type, 39 | get_json_object(event_json,'$.kv.add_time') add_time, 40 | server_time 41 | FROM 42 | ${APP}.dwd_base_event_log 43 | WHERE 44 | dt = '$do_date' 45 | AND event_name = 'praise';" 46 | 47 | echo "===开始从事件明细中提取日期为 $do_date 的点赞数据===" 48 | $hive -e "$sql" 49 | echo "===从事件明细中提取日期为 $do_date 的点赞数据完成===" 50 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/resources/Hive-DataBase-START-DWD-to-DWS.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 数据库名称 3 | APP=demo_database_gmall 4 | 5 | # hive目录 6 | hive=/usr/local/hive-2.3.7/bin/hive 7 | 8 | # 如果是输入的日期按照取输入日期;如果没输入日期取当前时间的前一天 9 | if [ -n "$1" ]; then 10 | do_date=$1 11 | else 12 | do_date=$(date -d "0 day" +%F) 13 | fi 14 | 15 | #每日设备行为 16 | sql=" 17 | INSERT overwrite TABLE ${APP}.dws_uv_detail_daycount PARTITION (dt = '$do_date') SELECT 18 | mid_id, 19 | concat_ws('|', collect_set(user_id)) user_id, 20 | concat_ws( 21 | '|', 22 | collect_set (version_code) 23 | ) version_code, 24 | concat_ws( 25 | '|', 26 | collect_set (version_name) 27 | ) version_name, 28 | concat_ws('|', collect_set(lang)) lang, 29 | concat_ws('|', collect_set(source)) source, 30 | concat_ws('|', collect_set(os)) os, 31 | concat_ws('|', collect_set(area)) area, 32 | concat_ws('|', collect_set(model)) model, 33 | concat_ws('|', collect_set(brand)) brand, 34 | concat_ws( 35 | '|', 36 | collect_set (sdk_version) 37 | ) sdk_version, 38 | concat_ws('|', collect_set(gmail)) gmail, 39 | concat_ws( 40 | '|', 41 | collect_set (height_width) 42 | ) height_width, 43 | concat_ws('|', collect_set(app_time)) app_time, 44 | concat_ws('|', collect_set(network)) network, 45 | concat_ws('|', collect_set(lng)) lng, 46 | concat_ws('|', collect_set(lat)) lat, 47 | count(*) login_count 48 | FROM 49 | ${APP}.dwd_start_log 50 | WHERE 51 | dt = '$do_date' 52 | GROUP BY 53 | mid_id;" 54 | 55 | echo "===START to TAKE User Daily Device behavior DATA From $do_date ===" 56 | $hive -e "$sql" 57 | echo "===END to TAKE User Daily Device behavior DATA From $do_date ===" 58 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/resources/Hive-DataBase-START-DWS-to-DWT.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 数据库名称 3 | APP=demo_database_gmall 4 | 5 | # hive目录 6 | hive=/usr/local/hive-2.3.7/bin/hive 7 | 8 | # 如果是输入的日期按照取输入日期;如果没输入日期取当前时间的前一天 9 | if [ -n "$1" ]; then 10 | do_date=$1 11 | else 12 | do_date=$(date -d "0 day" +%F) 13 | fi 14 | 15 | #设备主题宽表 16 | sql=" 17 | INSERT overwrite TABLE ${APP}.dwt_uv_topic SELECT 18 | nvl (new.mid_id, old.mid_id), 19 | nvl (new.user_id, old.user_id), 20 | nvl ( 21 | new.version_code, 22 | old.version_code 23 | ), 24 | nvl ( 25 | new.version_name, 26 | old.version_name 27 | ), 28 | nvl (new.lang, old.lang), 29 | nvl (new.source, old.source), 30 | nvl (new.os, old.os), 31 | nvl (new.area, old.area), 32 | nvl (new.model, old.model), 33 | nvl (new.brand, old.brand), 34 | nvl ( 35 | new.sdk_version, 36 | old.sdk_version 37 | ), 38 | nvl (new.gmail, old.gmail), 39 | nvl ( 40 | new.height_width, 41 | old.height_width 42 | ), 43 | nvl (new.app_time, old.app_time), 44 | nvl (new.network, old.network), 45 | nvl (new.lng, old.lng), 46 | nvl (new.lat, old.lat), 47 | 48 | IF ( 49 | old.mid_id IS NULL, 50 | '$do_date', 51 | old.login_date_first 52 | ), 53 | 54 | IF ( 55 | new.mid_id IS NOT NULL, 56 | '$do_date', 57 | old.login_date_last 58 | ), 59 | 60 | IF ( 61 | new.mid_id IS NOT NULL, 62 | new.login_count, 63 | 0 64 | ), 65 | nvl (old.login_count, 0) + 66 | IF (new.login_count > 0, 1, 0) 67 | FROM 68 | (SELECT * FROM ${APP}.dwt_uv_topic) old 69 | FULL OUTER JOIN ( 70 | SELECT 71 | * 72 | FROM 73 | ${APP}.dws_uv_detail_daycount 74 | WHERE 75 | dt = '$do_date' 76 | ) new ON old.mid_id = new.mid_id;" 77 | 78 | echo "===START to TAKE User Device subject wide table DATA From $do_date ===" 79 | $hive -e "$sql" 80 | echo "===END to TAKE User Device subject wide table DATA From $do_date ===" 81 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/resources/Hive-DataBase-START-DWT-to-ADS-ActiveDevices.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 数据库名称 3 | APP=demo_database_gmall 4 | 5 | # hive目录 6 | hive=/usr/local/hive-2.3.7/bin/hive 7 | 8 | # 如果是输入的日期按照取输入日期;如果没输入日期取当前时间的前一天 9 | if [ -n "$1" ]; then 10 | do_date=$1 11 | else 12 | do_date=$(date -d "-1 day" +%F) 13 | fi 14 | 15 | sql=" 16 | 17 | INSERT INTO TABLE ${APP}.ads_uv_count SELECT 18 | '$do_date' dt, 19 | daycount.ct, 20 | wkcount.ct, 21 | mncount.ct, 22 | 23 | IF ( 24 | date_add( 25 | next_day ('$do_date', 'MO') ,- 1 26 | ) = '$do_date', 27 | 'Y', 28 | 'N' 29 | ), 30 | 31 | IF ( 32 | last_day('$do_date') = '$do_date', 33 | 'Y', 34 | 'N' 35 | ) 36 | FROM 37 | ( 38 | SELECT 39 | '$do_date' dt, 40 | count(*) ct 41 | FROM 42 | ${APP}.dwt_uv_topic 43 | WHERE 44 | login_date_last = '$do_date' 45 | ) daycount 46 | JOIN ( 47 | SELECT 48 | '$do_date' dt, 49 | count(*) ct 50 | FROM 51 | ${APP}.dwt_uv_topic 52 | WHERE 53 | login_date_last >= date_add( 54 | next_day ('$do_date', 'MO') ,- 7 55 | ) 56 | AND login_date_last <= date_add( 57 | next_day ('$do_date', 'MO') ,- 1 58 | ) 59 | ) wkcount ON daycount.dt = wkcount.dt 60 | JOIN ( 61 | SELECT 62 | '$do_date' dt, 63 | count(*) ct 64 | FROM 65 | ${APP}.dwt_uv_topic 66 | WHERE 67 | date_format(login_date_last, 'yyyy-MM') = date_format('$do_date', 'yyyy-MM') 68 | ) mncount ON daycount.dt = mncount.dt; " 69 | 70 | echo "===START TO TAKE Number of active devices DATA From $do_date ===" 71 | $hive -e "$sql" 72 | echo "===Finished TO TAKE Number of active devices DATA From $do_date ===" 73 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/resources/Hive-DataBase-START-DWT-to-ADS-ActiveUsersLastThreeConsecutiveWeeks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 数据库名称 3 | APP=demo_database_gmall 4 | 5 | # hive目录 6 | hive=/usr/local/hive-2.3.7/bin/hive 7 | 8 | # 如果是输入的日期按照取输入日期;如果没输入日期取当前时间的前一天 9 | if [ -n "$1" ]; then 10 | do_date=$1 11 | else 12 | do_date=$(date -d "-1 day" +%F) 13 | fi 14 | 15 | sql=" 16 | INSERT INTO TABLE ${APP}.ads_continuity_wk_count SELECT 17 | '$do_date', 18 | concat( 19 | date_add( 20 | next_day ('$do_date', 'MO') ,- 7 * 3 21 | ), 22 | '_', 23 | date_add( 24 | next_day ('$do_date', 'MO') ,- 1 25 | ) 26 | ), 27 | count(*) 28 | FROM 29 | ( 30 | SELECT 31 | mid_id 32 | FROM 33 | ( 34 | SELECT mid_id 35 | FROM 36 | ${APP}.dws_uv_detail_daycount 37 | WHERE 38 | dt >= date_add( 39 | next_day ('$do_date', 'monday') ,- 7 40 | ) 41 | AND dt <= date_add( 42 | next_day ('$do_date', 'monday') ,- 1 43 | ) 44 | GROUP BY 45 | mid_id 46 | UNION ALL 47 | SELECT 48 | mid_id 49 | FROM 50 | ${APP}.dws_uv_detail_daycount 51 | WHERE 52 | dt >= date_add( 53 | next_day ('$do_date', 'monday') ,- 7 * 2 54 | ) 55 | AND dt <= date_add( 56 | next_day ('$do_date', 'monday') ,- 7 - 1 57 | ) 58 | GROUP BY 59 | mid_id 60 | UNION ALL 61 | SELECT 62 | mid_id 63 | FROM 64 | ${APP}.dws_uv_detail_daycount 65 | WHERE 66 | dt >= date_add( 67 | next_day ('$do_date', 'monday') ,- 7 * 3 68 | ) 69 | AND dt <= date_add( 70 | next_day ('$do_date', 'monday') ,- 7 * 2 - 1 71 | ) 72 | GROUP BY 73 | mid_id 74 | ) t1 75 | GROUP BY 76 | mid_id 77 | HAVING 78 | count(*) = 3 79 | ) t2;" 80 | 81 | echo "===START TO TAKE The Number of active users in the last three consecutive weeks DATA From $do_date ===" 82 | $hive -e "$sql" 83 | echo "===Finished TO TAKE The Number of active users in the last three consecutive weeks DATA From $do_date ===" 84 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/resources/Hive-DataBase-START-DWT-to-ADS-ContinuousActiveDevices.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 数据库名称 3 | APP=demo_database_gmall 4 | 5 | # hive目录 6 | hive=/usr/local/hive-2.3.7/bin/hive 7 | 8 | # 如果是输入的日期按照取输入日期;如果没输入日期取当前时间的前一天 9 | if [ -n "$1" ]; then 10 | do_date=$1 11 | else 12 | do_date=$(date -d "-1 day" +%F) 13 | fi 14 | 15 | sql=" 16 | INSERT INTO TABLE ${APP}.ads_continuity_uv_count SELECT 17 | '$do_date', 18 | concat( 19 | date_add('$do_date' ,- 6), 20 | '_', 21 | '$do_date' 22 | ), 23 | count(*) 24 | FROM 25 | ( 26 | SELECT 27 | mid_id 28 | FROM 29 | ( 30 | SELECT 31 | mid_id 32 | FROM 33 | ( 34 | SELECT 35 | mid_id, 36 | date_sub(dt, rank) date_dif 37 | FROM 38 | ( 39 | SELECT 40 | mid_id, 41 | dt, 42 | rank () over (PARTITION BY mid_id ORDER BY dt) rank 43 | FROM 44 | ${APP}.dws_uv_detail_daycount 45 | WHERE 46 | dt >= date_add('$do_date' ,- 6) 47 | AND dt <= '$do_date' 48 | ) t1 49 | ) t2 50 | GROUP BY 51 | mid_id, 52 | date_dif 53 | HAVING 54 | count(*) >= 3 55 | ) t3 56 | GROUP BY 57 | mid_id 58 | ) t4;" 59 | 60 | echo "===START TO TAKE The Number of continuous active devices DATA From $do_date ===" 61 | $hive -e "$sql" 62 | echo "===Finished TO TAKE The Number of continuous active devices DATA From $do_date ===" 63 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/resources/Hive-DataBase-START-DWT-to-ADS-LostUsers.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 数据库名称 3 | APP=demo_database_gmall 4 | 5 | # hive目录 6 | hive=/usr/local/hive-2.3.7/bin/hive 7 | 8 | # 如果是输入的日期按照取输入日期;如果没输入日期取当前时间的前一天 9 | if [ -n "$1" ]; then 10 | do_date=$1 11 | else 12 | do_date=$(date -d "-1 day" +%F) 13 | fi 14 | 15 | sql=" 16 | INSERT INTO TABLE ${APP}.ads_wastage_count SELECT 17 | '$do_date', 18 | count(*) 19 | FROM 20 | ( 21 | SELECT 22 | mid_id 23 | FROM 24 | ${APP}.dwt_uv_topic 25 | WHERE 26 | login_date_last <= date_add('$do_date' ,- 7) 27 | GROUP BY 28 | mid_id 29 | ) t1;" 30 | 31 | echo "===START TO TAKE The Number of lost users DATA From $do_date ===" 32 | $hive -e "$sql" 33 | echo "===Finished TO TAKE The Number of lost users DATA From $do_date ===" 34 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/resources/Hive-DataBase-START-DWT-to-ADS-NumberOfNewDeviceAddedDaily.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 数据库名称 3 | APP=demo_database_gmall 4 | 5 | # hive目录 6 | hive=/usr/local/hive-2.3.7/bin/hive 7 | 8 | # 如果是输入的日期按照取输入日期;如果没输入日期取当前时间的前一天 9 | if [ -n "$1" ]; then 10 | do_date=$1 11 | else 12 | do_date=$(date -d "-1 day" +%F) 13 | fi 14 | 15 | sql=" 16 | 17 | INSERT INTO TABLE ${APP}.ads_new_mid_count SELECT 18 | login_date_first, 19 | count(*) 20 | FROM 21 | ${APP}.dwt_uv_topic 22 | WHERE 23 | login_date_first = '$do_date' 24 | GROUP BY 25 | login_date_first;" 26 | 27 | echo "===START TO TAKE The number of new device information added daily DATA From $do_date ===" 28 | $hive -e "$sql" 29 | echo "===Finished TO TAKE The number of new device information added daily DATA From $do_date ===" 30 | 31 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/resources/Hive-DataBase-START-DWT-to-ADS-NumberOfSilentUsers.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 数据库名称 3 | APP=demo_database_gmall 4 | 5 | # hive目录 6 | hive=/usr/local/hive-2.3.7/bin/hive 7 | 8 | # 如果是输入的日期按照取输入日期;如果没输入日期取当前时间的前一天 9 | if [ -n "$1" ]; then 10 | do_date=$1 11 | else 12 | do_date=$(date -d "-1 day" +%F) 13 | fi 14 | 15 | sql=" 16 | 17 | INSERT INTO TABLE ${APP}.ads_silent_count SELECT 18 | '$do_date', 19 | count(*) 20 | FROM 21 | ${APP}.dwt_uv_topic 22 | WHERE 23 | login_date_first = login_date_last 24 | AND login_date_last <= date_add('$do_date' ,- 7);" 25 | 26 | echo "===START TO TAKE The Number of silent users DATA From $do_date ===" 27 | $hive -e "$sql" 28 | echo "===Finished TO TAKE The Number of silent users DATA From $do_date ===" 29 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/resources/Hive-DataBase-START-DWT-to-ADS-ReturningUsers.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 数据库名称 3 | APP=demo_database_gmall 4 | 5 | # hive目录 6 | hive=/usr/local/hive-2.3.7/bin/hive 7 | 8 | # 如果是输入的日期按照取输入日期;如果没输入日期取当前时间的前一天 9 | if [ -n "$1" ]; then 10 | do_date=$1 11 | else 12 | do_date=$(date -d "-1 day" +%F) 13 | fi 14 | 15 | sql=" 16 | INSERT INTO TABLE ${APP}.ads_back_count SELECT 17 | '$do_date', 18 | count(*) 19 | FROM 20 | ( 21 | SELECT 22 | mid_id 23 | FROM 24 | ${APP}.dwt_uv_topic 25 | WHERE 26 | login_date_last >= date_add( 27 | next_day ('$do_date', 'MO') ,- 7 28 | ) 29 | AND login_date_last <= date_add( 30 | next_day ('$do_date', 'MO') ,- 1 31 | ) 32 | AND login_date_first < date_add( 33 | next_day ('$do_date', 'MO') ,- 7 34 | ) 35 | ) current_wk 36 | LEFT JOIN ( 37 | SELECT 38 | mid_id 39 | FROM 40 | ${APP}.dws_uv_detail_daycount 41 | WHERE 42 | dt >= date_add( 43 | next_day ('$do_date', 'MO') ,- 7 * 2 44 | ) 45 | AND dt <= date_add( 46 | next_day ('$do_date', 'MO') ,- 7 - 1 47 | ) 48 | GROUP BY 49 | mid_id 50 | ) last_wk ON current_wk.mid_id = last_wk.mid_id 51 | WHERE 52 | last_wk.mid_id IS NULL; 53 | " 54 | 55 | echo "===START TO TAKE The Number of returning users this week DATA From $do_date ===" 56 | $hive -e "$sql" 57 | echo "===Finished TO TAKE The Number of returning users this week DATA From $do_date ===" 58 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/resources/Hive-DataBase-START-ODS-to-DWD.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 数据库名称 3 | APP=demo_database_gmall 4 | 5 | # hive目录 6 | hive=/usr/local/hive-2.3.7/bin/hive 7 | 8 | # 如果是输入的日期按照取输入日期;如果没输入日期取当前时间的前一天 9 | if [ -n "$1" ]; then 10 | do_date=$1 11 | else 12 | do_date=$(date -d "-1 day" +%F) 13 | fi 14 | 15 | # get_json_object(string json_string, string path) 16 | # 17 | #说明: 18 | #第一个参数填写json对象变量,第二个参数使用$表示json变量标识,然后用 . 或 [] 读取对象或数组;如果输入的json字符串无效,那么返回NULL。 19 | #每次只能返回一个数据项。 20 | 21 | sql=" 22 | set hive.exec.dynamic.partition.mode=nonstrict; 23 | INSERT OVERWRITE TABLE ${APP}.dwd_start_log 24 | PARTITION (dt='$do_date') 25 | select 26 | get_json_object(line,'$.mid') mid_id, 27 | get_json_object(line,'$.uid') user_id, 28 | get_json_object(line,'$.vc') version_code, 29 | get_json_object(line,'$.vn') version_name, 30 | get_json_object(line,'$.l') lang, 31 | get_json_object(line,'$.sr') source, 32 | get_json_object(line,'$.os') os, 33 | get_json_object(line,'$.ar') area, 34 | get_json_object(line,'$.md') model, 35 | get_json_object(line,'$.ba') brand, 36 | get_json_object(line,'$.sv') sdk_version, 37 | get_json_object(line,'$.g') gmail, 38 | get_json_object(line,'$.hw') height_width, 39 | get_json_object(line,'$.t') app_time, 40 | get_json_object(line,'$.nw') network, 41 | get_json_object(line,'$.ln') lng, 42 | get_json_object(line,'$.la') lat, 43 | get_json_object(line,'$.entry') entry, 44 | get_json_object(line,'$.open_ad_type') open_ad_type, 45 | get_json_object(line,'$.action') action, 46 | get_json_object(line,'$.loading_time') loading_time, 47 | get_json_object(line,'$.detail') detail, 48 | get_json_object(line,'$.extend1') extend1 from ${APP}.ods_start_log where dt='$do_date'; " 49 | 50 | echo "===开始清洗日志日期为 $do_date 的数据===" 51 | $hive -e "$sql" 52 | echo "===日志日期为 $do_date 的数据清洗完成===" 53 | -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/resources/Start_Log.json: -------------------------------------------------------------------------------- 1 | { 2 | "mid": "M0001", 3 | "uid": "2020092409590001", 4 | "vc": "V 2.3.1", 5 | "vn": "Beta", 6 | "l": "CHN", 7 | "sr": "C", 8 | "os": "8.6", 9 | "ar": "shen zhen", 10 | "md": "Plus", 11 | "ba": "Apple", 12 | "sv": "V 1.5.6", 13 | "g": "heyong@gmail.com", 14 | "hw": "20*10", 15 | "t": "2020-10-20 09:35:00", 16 | "nw": "4G", 17 | "ln": "-63.8", 18 | "la": "-0.69999999", 19 | "entry": "App", 20 | "open_ad_type": "Web H5", 21 | "action": "login", 22 | "loading_time": "202009241038521", 23 | "detail": "用户->2020092409590001在设备->M0001启动了APP!", 24 | "extend1": { 25 | "data": "APP启动日志", 26 | "date": "2020-10-20" 27 | } 28 | } -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/resources/application-dev.yml: -------------------------------------------------------------------------------- 1 | #日志配置文件 2 | logging: 3 | config: classpath:logback-spring.xml 4 | 5 | #服务器端口号 6 | server: 7 | port: 8089 8 | 9 | #配置hive数据源 10 | spring: 11 | datasource: 12 | hdfs: #hdfs数据源 对应的是/etc/hadoop目录下的core-site.xml文件中的配置 13 | name: fs.defaultFS 14 | url: hdfs://172.12.0.4:9000 15 | user: root 16 | hive: #hive数据源 一定要启动hiveserver2服务 17 | url: jdbc:hive2://172.12.0.4:10000/demo_database_gmall 18 | type: com.alibaba.druid.pool.DruidDataSource 19 | username: hive 20 | password: hive 21 | driver-class-name: org.apache.hive.jdbc.HiveDriver 22 | pool: #连接池统一配置,应用到所有的数据源 23 | initial-size: 1 24 | min-idle: 1 25 | max-idle: 5 26 | max-active: 50 27 | max-wait: 10000 # 配置获取连接等待超时的时间 28 | time-between-eviction-runs-millis: 10000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 29 | min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存的时间,单位是毫秒 30 | validation-query: select 'x' 31 | test-while-idle: true 32 | test-on-borrow: false 33 | test-on-return: false 34 | pool-prepared-statements: true # 打开PSCache,并且指定每个连接上PSCache的大小 35 | max-pool-prepared-statement-per-connection-size: 20 36 | filters: stat -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/resources/application-pro.yml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bys-eric-he/com-hadoop-bigdata-demo/390cc4369033261c1abac8867fd59ec3f7ac2c8b/com-hadoop-hive-demo/src/main/resources/application-pro.yml -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | profiles: 3 | active: dev -------------------------------------------------------------------------------- /com-hadoop-hive-demo/src/main/resources/azkaban-job.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bys-eric-he/com-hadoop-bigdata-demo/390cc4369033261c1abac8867fd59ec3f7ac2c8b/com-hadoop-hive-demo/src/main/resources/azkaban-job.zip -------------------------------------------------------------------------------- /com-hadoop-kafka-demo/src/main/java/com/hadoop/kafka/SpringBootHadoopKafkaApplication.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.kafka; 2 | 3 | import com.hadoop.kafka.common.KafkaUtils; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.mybatis.spring.annotation.MapperScan; 6 | import org.springframework.boot.SpringApplication; 7 | import org.springframework.boot.autoconfigure.SpringBootApplication; 8 | import org.springframework.context.ConfigurableApplicationContext; 9 | 10 | import java.util.List; 11 | 12 | @Slf4j 13 | @MapperScan(basePackages = "com.hadoop.kafka.mapper") 14 | @SpringBootApplication 15 | public class SpringBootHadoopKafkaApplication { 16 | public static void main(String[] args) { 17 | ConfigurableApplicationContext context = SpringApplication.run(SpringBootHadoopKafkaApplication.class, args); 18 | KafkaUtils kafkaUtils = context.getBean(KafkaUtils.class); 19 | List queryAllTopic = kafkaUtils.queryAllTopic(); 20 | log.info("---->当前系统所有消息主题:{}", queryAllTopic.toString()); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /com-hadoop-kafka-demo/src/main/java/com/hadoop/kafka/common/Result.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.kafka.common; 2 | 3 | 4 | import lombok.Data; 5 | 6 | /** 7 | * API 统一返回结果 8 | * 9 | * @param 10 | */ 11 | @Data 12 | public class Result { 13 | 14 | /** 15 | * 响应码 16 | */ 17 | private Integer resCode; 18 | 19 | /** 20 | * 错误码 21 | */ 22 | private String errCode; 23 | 24 | /** 25 | * 错误信息 26 | */ 27 | private String errMsg; 28 | 29 | /** 30 | * 数据 31 | */ 32 | private T data; 33 | 34 | public Result(Integer resCode, String errCode, String errMsg, T data) { 35 | this.resCode = resCode; 36 | this.errCode = errCode; 37 | this.errMsg = errMsg; 38 | this.data = data; 39 | } 40 | } -------------------------------------------------------------------------------- /com-hadoop-kafka-demo/src/main/java/com/hadoop/kafka/common/SpringContextUtil.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.kafka.common; 2 | 3 | import org.springframework.context.ApplicationContext; 4 | import org.springframework.context.ApplicationContextAware; 5 | import org.springframework.stereotype.Component; 6 | 7 | /** 8 | * 使用上下文获取bean 9 | */ 10 | @Component 11 | public class SpringContextUtil implements ApplicationContextAware { 12 | private static ApplicationContext applicationContext; 13 | 14 | /** 15 | * 获取上下文 16 | * 17 | * @return 18 | */ 19 | public static ApplicationContext getApplicationContext() { 20 | return applicationContext; 21 | } 22 | 23 | /** 24 | * 设置上下文 25 | * 26 | * @param applicationContext 27 | */ 28 | @Override 29 | public void setApplicationContext(ApplicationContext applicationContext) { 30 | SpringContextUtil.applicationContext = applicationContext; 31 | } 32 | 33 | /** 34 | * 通过名字获取上下文中的bean 35 | * 36 | * @param name 37 | * @return 38 | */ 39 | public static Object getBean(String name) { 40 | return applicationContext.getBean(name); 41 | } 42 | 43 | /** 44 | * 通过类型获取上下文中的bean 45 | * 46 | * @param requiredType 47 | * @return 48 | */ 49 | public static Object getBean(Class requiredType) { 50 | return applicationContext.getBean(requiredType); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /com-hadoop-kafka-demo/src/main/java/com/hadoop/kafka/common/TopicConstant.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.kafka.common; 2 | 3 | /** 4 | * 常量类 5 | */ 6 | public class TopicConstant { 7 | /** 8 | * 用户日志消息主题 9 | */ 10 | public static String USER_LOG_TOPIC_MESSAGE = "kafka_topic_user_log_message"; 11 | 12 | /** 13 | * 用户订单消息主题 14 | */ 15 | public static String USER_ORDER_TOPIC_MESSAGE = "kafka_topic_user_order_message"; 16 | 17 | /** 18 | * 用户日志流式处理主题 19 | */ 20 | public static String USER_LOG_PROCESSOR_TOPIC_FROM = "kafka_topic_log_processor_from"; 21 | 22 | /** 23 | * 用户日志流式处理主题 24 | */ 25 | public static String USER_LOG_PROCESSOR_TOPIC_TO = "kafka_topic_log_processor_to"; 26 | /** 27 | * 实时流处理输入主题 28 | */ 29 | public static String KAFKA_STREAMS_PIPE_INPUT = "kafka_streams_pipe_input"; 30 | /** 31 | * 实时流处理输出主题 32 | */ 33 | public static String KAFKA_STREAMS_PIPE_OUTPUT = "kafka_streams_pipe_output"; 34 | 35 | /** 36 | * 实时流单词分割字符串输入主题 37 | */ 38 | public static String KAFKA_STREAMS_LINESPLIT_INPUT = "kafka_streams_linesplit_input"; 39 | 40 | /** 41 | * 实时流单词分割字符串输出主题 42 | */ 43 | public static String KAFKA_STREAMS_LINESPLIT_OUTPUT = "kafka_streams_linesplit_output"; 44 | } 45 | -------------------------------------------------------------------------------- /com-hadoop-kafka-demo/src/main/java/com/hadoop/kafka/config/PartitionStrategyConfig.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.kafka.config; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.apache.kafka.clients.producer.Partitioner; 5 | import org.apache.kafka.common.Cluster; 6 | import org.apache.kafka.common.PartitionInfo; 7 | 8 | import java.util.List; 9 | import java.util.Map; 10 | import java.util.Random; 11 | 12 | /** 13 | * 自定义分区策略 14 | * 在发送一条消息时,我们可以指定这个 Key,那么 Producer 会根据 Key 和 partition 机制来判断, 15 | * 当前这条消息应该发送并存储到哪个 partition 中(这个就跟分片机制类似)。 16 | * 我们可以根据需要进行扩展 Producer 的 partition 机制(默认算法是 hash 取 %)。 17 | */ 18 | 19 | @Slf4j 20 | public class PartitionStrategyConfig implements Partitioner { 21 | 22 | @Override 23 | public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) { 24 | //获取当前 topic 有多少个分区(分区列表) 25 | List partitions = cluster.partitionsForTopic(topic); 26 | int partitionNum = 0; 27 | 28 | //Key 是可以传空值的 29 | if (key == null) { 30 | partitionNum = new Random().nextInt(partitions.size()); //随机 31 | } else { 32 | //取 % 33 | partitionNum = Math.abs((key.hashCode()) % partitions.size()); 34 | } 35 | log.warn("自定义分区策略---->key:" + key + ",value:" + value + ",partitionNum:" + partitionNum + ",partitionSize: " + partitions.size()); 36 | //发送到指定分区 37 | return partitionNum; 38 | } 39 | 40 | @Override 41 | public void close() { 42 | 43 | } 44 | 45 | @Override 46 | public void configure(Map configs) { 47 | 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /com-hadoop-kafka-demo/src/main/java/com/hadoop/kafka/config/Swagger2Config.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.kafka.config; 2 | 3 | 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | import org.springframework.web.bind.annotation.RestController; 7 | import springfox.documentation.builders.ApiInfoBuilder; 8 | import springfox.documentation.builders.PathSelectors; 9 | import springfox.documentation.builders.RequestHandlerSelectors; 10 | import springfox.documentation.service.ApiInfo; 11 | import springfox.documentation.service.Contact; 12 | import springfox.documentation.spi.DocumentationType; 13 | import springfox.documentation.spring.web.plugins.Docket; 14 | import springfox.documentation.swagger2.annotations.EnableSwagger2; 15 | 16 | import java.time.LocalDateTime; 17 | import java.util.Date; 18 | 19 | @Configuration 20 | @EnableSwagger2 21 | public class Swagger2Config { 22 | 23 | /** 24 | * Swagger组件注册 25 | */ 26 | @Bean 27 | public Docket api() { 28 | return new Docket(DocumentationType.SWAGGER_2) 29 | .apiInfo(apiInfo()) 30 | .select() 31 | .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class)) 32 | .paths(PathSelectors.any()) 33 | .build() 34 | .directModelSubstitute(LocalDateTime.class, Date.class); 35 | } 36 | 37 | private ApiInfo apiInfo() { 38 | return new ApiInfoBuilder() 39 | .title("Spring Boot For Kafka Demo API V1.0") 40 | .description("Spring Boot Hadoop Kafka Application") 41 | .termsOfServiceUrl("http://localhost:8500/swagger-ui.html") 42 | .contact(new Contact("he yong", "", "heyong@9fstock.com")) 43 | .version("1.0") 44 | .build(); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /com-hadoop-kafka-demo/src/main/java/com/hadoop/kafka/consumer/AbstractBaseConsumer.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.kafka.consumer; 2 | 3 | import org.apache.kafka.clients.consumer.ConsumerRecord; 4 | 5 | public abstract class AbstractBaseConsumer { 6 | /** 7 | * 消费处理 8 | * 9 | * @param consumerRecord 10 | * @return 11 | */ 12 | protected abstract void call(ConsumerRecord consumerRecord); 13 | 14 | public void action(ConsumerRecord consumerRecord) { 15 | this.call(consumerRecord); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /com-hadoop-kafka-demo/src/main/java/com/hadoop/kafka/consumer/UserLogConsumer.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.kafka.consumer; 2 | 3 | import com.hadoop.kafka.handler.KafkaConsumerResultHandler; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.apache.kafka.clients.consumer.ConsumerRecord; 6 | import org.springframework.kafka.annotation.KafkaListener; 7 | import org.springframework.stereotype.Component; 8 | 9 | /** 10 | * 日志消费者 11 | */ 12 | @Slf4j 13 | @Component 14 | public class UserLogConsumer extends AbstractBaseConsumer { 15 | /** 16 | * 订阅者 17 | * 对同一个topic,不同组中的订阅者都会收到消息,即一个topic对应多个consumer, 18 | * 同一组中的订阅者只有一个consumer能够收到消息,即一个topic对应一个consumer. 19 | * 20 | * @param consumerRecord 21 | */ 22 | @KafkaListener( 23 | id = "user-log-consumer-one", 24 | groupId = "kafka_consumer_group_user_log", 25 | topics = "kafka_topic_user_log_message") 26 | public void consumer(ConsumerRecord consumerRecord) { 27 | super.action(consumerRecord); 28 | } 29 | 30 | /** 31 | * 消费处理 32 | * 33 | * @param consumerRecord 34 | * @return 35 | */ 36 | @Override 37 | protected void call(ConsumerRecord consumerRecord) { 38 | KafkaConsumerResultHandler consumerData = new KafkaConsumerResultHandler(consumerRecord); 39 | try { 40 | String result = consumerData.call(); 41 | log.info(result); 42 | } catch (Exception e) { 43 | e.printStackTrace(); 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /com-hadoop-kafka-demo/src/main/java/com/hadoop/kafka/container/ThreadMessageListenerContainer.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.kafka.container; 2 | 3 | import org.springframework.kafka.core.ConsumerFactory; 4 | import org.springframework.kafka.listener.ConcurrentMessageListenerContainer; 5 | import org.springframework.kafka.listener.ContainerProperties; 6 | 7 | /** 8 | * 继承消息监听容器 9 | */ 10 | public class ThreadMessageListenerContainer extends ConcurrentMessageListenerContainer { 11 | 12 | public ThreadMessageListenerContainer(ConsumerFactory consumerFactory, ContainerProperties containerProperties) { 13 | super(consumerFactory, containerProperties); 14 | } 15 | 16 | public void startContainer() { 17 | super.doStart(); 18 | } 19 | } -------------------------------------------------------------------------------- /com-hadoop-kafka-demo/src/main/java/com/hadoop/kafka/controller/UserLogController.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.kafka.controller; 2 | 3 | import com.hadoop.kafka.common.Result; 4 | import com.hadoop.kafka.common.ResultUtil; 5 | import com.hadoop.kafka.model.UserLog; 6 | import com.hadoop.kafka.producer.UserLogProducer; 7 | import io.swagger.annotations.Api; 8 | import io.swagger.annotations.ApiOperation; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.web.bind.annotation.RequestMapping; 11 | import org.springframework.web.bind.annotation.RequestMethod; 12 | import org.springframework.web.bind.annotation.RestController; 13 | 14 | @Api(value = "/api/v1/user-log", tags = "用户日志API服务") 15 | @RestController 16 | @RequestMapping("/api/v1/user-log") 17 | public class UserLogController { 18 | 19 | @Autowired 20 | private UserLogProducer userLogProducer; 21 | 22 | @ApiOperation("发送日志到后端") 23 | @RequestMapping(path = "/send", method = RequestMethod.POST) 24 | public Result getCarCityCountyDistribution(UserLog userlog) { 25 | userLogProducer.sendlog(userlog); 26 | return ResultUtil.success(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /com-hadoop-kafka-demo/src/main/java/com/hadoop/kafka/controller/UserOrderController.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.kafka.controller; 2 | 3 | import com.hadoop.kafka.common.Result; 4 | import com.hadoop.kafka.common.ResultUtil; 5 | import com.hadoop.kafka.model.UserOrder; 6 | import com.hadoop.kafka.producer.UserOrderProducer; 7 | import com.hadoop.kafka.service.UserOrderService; 8 | import io.swagger.annotations.Api; 9 | import io.swagger.annotations.ApiOperation; 10 | import org.springframework.beans.factory.annotation.Autowired; 11 | import org.springframework.beans.factory.annotation.Qualifier; 12 | import org.springframework.web.bind.annotation.RequestMapping; 13 | import org.springframework.web.bind.annotation.RequestMethod; 14 | import org.springframework.web.bind.annotation.RestController; 15 | 16 | import javax.annotation.Resource; 17 | import java.util.List; 18 | 19 | @Api(value = "/api/v1/user-order", tags = "用户订单API服务") 20 | @RestController 21 | @RequestMapping("/api/v1/user-order") 22 | public class UserOrderController { 23 | 24 | @Autowired 25 | private UserOrderProducer userOrderProducer; 26 | 27 | @Resource 28 | @Qualifier("userOrderService") 29 | private UserOrderService userOrderService; 30 | 31 | @ApiOperation("发送订单到后端") 32 | @RequestMapping(path = "/send", method = RequestMethod.POST) 33 | public Result getCarCityCountyDistribution(UserOrder userOrder) { 34 | userOrderProducer.sendOrder(userOrder); 35 | return ResultUtil.success(); 36 | } 37 | 38 | @ApiOperation("获取所有订单列表") 39 | @RequestMapping(path = "/list", method = RequestMethod.GET) 40 | public Result> getAllOrders() { 41 | List userOrders = userOrderService.getAllOrders(); 42 | 43 | return ResultUtil.success(userOrders); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /com-hadoop-kafka-demo/src/main/java/com/hadoop/kafka/entity/UserOrderEntity.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.kafka.entity; 2 | 3 | import lombok.Getter; 4 | import lombok.NoArgsConstructor; 5 | import lombok.Setter; 6 | import lombok.ToString; 7 | 8 | @Setter 9 | @Getter 10 | @NoArgsConstructor 11 | @ToString 12 | public class UserOrderEntity { 13 | private String orderID; 14 | private String userID; 15 | private String number; 16 | private Double price; 17 | private String productID; 18 | } 19 | -------------------------------------------------------------------------------- /com-hadoop-kafka-demo/src/main/java/com/hadoop/kafka/event/listener/UserOrderListener.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.kafka.event.listener; 2 | 3 | import com.hadoop.kafka.event.model.UserOrderEvent; 4 | import com.hadoop.kafka.model.UserOrder; 5 | import com.hadoop.kafka.service.UserOrderService; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.codehaus.jackson.map.ObjectMapper; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.beans.factory.annotation.Qualifier; 10 | import org.springframework.context.ApplicationListener; 11 | import org.springframework.stereotype.Component; 12 | 13 | /** 14 | * 事件监听器 继承ApplicationListener接口 方式 15 | * 实现 ApplicationListener接口, 并指定监听的事件类型 16 | */ 17 | @Slf4j 18 | @Component 19 | public class UserOrderListener implements ApplicationListener { 20 | 21 | @Autowired 22 | @Qualifier("userOrderService") 23 | private UserOrderService userOrderService; 24 | 25 | private ObjectMapper objectMapper = new ObjectMapper(); 26 | 27 | /** 28 | * 事件处理 29 | * 30 | * @param userOrderEvent 使用 onApplicationEvent方法对消息进行接受处理 31 | */ 32 | @Override 33 | public void onApplicationEvent(UserOrderEvent userOrderEvent) { 34 | try { 35 | UserOrder userOrder = userOrderEvent.getUserOrder(); 36 | log.info("----->我 (UserOrderListener) 接收到了 UserOrderPublisher 发布的消息:" 37 | + objectMapper.writeValueAsString(userOrder) + "发布时间:" + userOrderEvent.getTimestamp()); 38 | userOrderService.upInsertUserOrder(userOrder); 39 | } catch (Exception ex) { 40 | log.error("***************事件监听器处理异常********************" + ex.getMessage()); 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /com-hadoop-kafka-demo/src/main/java/com/hadoop/kafka/event/listener/UserOrderListenerConfig.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.kafka.event.listener; 2 | 3 | import com.hadoop.kafka.event.model.UserOrderEvent; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.springframework.context.annotation.Configuration; 6 | import org.springframework.context.event.EventListener; 7 | import org.springframework.scheduling.annotation.Async; 8 | 9 | /** 10 | * 监听配置 使用@EventListener方式 11 | */ 12 | @Configuration 13 | @Slf4j 14 | public class UserOrderListenerConfig { 15 | /* 16 | @EventListener 17 | public void handleEvent(Object event) { 18 | //监听所有事件 可以看看 系统各类时间 发布了哪些事件 19 | //可根据 instanceof 监听想要监听的事件 20 | if (event instanceof UserOrderEvent) { 21 | log.info("---->监听到UserOrderEvent事件:{}", event); 22 | } else { 23 | log.info("---->事件:{}", event); 24 | } 25 | }*/ 26 | 27 | /** 28 | * 异步监听 29 | * 30 | * @param userOrderEvent 31 | */ 32 | @Async 33 | @EventListener 34 | public void handleCustomEvent(UserOrderEvent userOrderEvent) { 35 | //监听UserOrderEvent事件 36 | log.info("---->异步监听听到UserOrderEvent事件,消息为:{}, 发布时间:{}", userOrderEvent.getUserOrder(), userOrderEvent.getTimestamp()); 37 | } 38 | 39 | 40 | 41 | /* 42 | * 监听 orderID为202100001的事件 43 | * 44 | @EventListener(condition = "#userOrderEvent.userOrder.orderID == '202100001'") 45 | public void handleCustomEventByCondition(UserOrderEvent userOrderEvent) { 46 | //监听UserOrderEvent事件 47 | log.info("---->监听到orderID为'202100001'的userOrderEvent事件, 消息为:{}, 发布时间:{}", userOrderEvent.getUserOrder(), userOrderEvent.getTimestamp()); 48 | }*/ 49 | } 50 | -------------------------------------------------------------------------------- /com-hadoop-kafka-demo/src/main/java/com/hadoop/kafka/event/model/UserOrderEvent.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.kafka.event.model; 2 | 3 | import com.hadoop.kafka.model.UserOrder; 4 | import org.springframework.context.ApplicationEvent; 5 | 6 | /** 7 | * 用户订单事件源 8 | */ 9 | public class UserOrderEvent extends ApplicationEvent { 10 | private static final long serialVersionUID = 1L; 11 | private UserOrder userOrder; 12 | 13 | public UserOrderEvent(Object source, UserOrder userOrder) { 14 | super(source); 15 | this.userOrder = userOrder; 16 | } 17 | 18 | public UserOrder getUserOrder() { 19 | return userOrder; 20 | } 21 | 22 | public void setUserOrder(UserOrder userOrder) { 23 | this.userOrder = userOrder; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /com-hadoop-kafka-demo/src/main/java/com/hadoop/kafka/event/publisher/UserOrderPublisher.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.kafka.event.publisher; 2 | 3 | import com.hadoop.kafka.event.model.UserOrderEvent; 4 | import com.hadoop.kafka.model.UserOrder; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.context.ApplicationContext; 7 | import org.springframework.stereotype.Component; 8 | 9 | @Component 10 | public class UserOrderPublisher { 11 | /** 12 | * 注入 AppllcationContext用来发布事件 13 | */ 14 | @Autowired 15 | private ApplicationContext applicationContext; 16 | 17 | /** 18 | * 使用 AppllicationContext的 publishEvent方法来发布 19 | * 20 | * @param userOrder 21 | */ 22 | public void publish(UserOrder userOrder) { 23 | applicationContext.publishEvent(new UserOrderEvent(this, userOrder)); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /com-hadoop-kafka-demo/src/main/java/com/hadoop/kafka/factory/AbstractBaseFactory.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.kafka.factory; 2 | 3 | import lombok.Data; 4 | import org.springframework.beans.factory.annotation.Autowired; 5 | import org.springframework.beans.factory.annotation.Value; 6 | import org.springframework.context.ApplicationContext; 7 | 8 | @Data 9 | public abstract class AbstractBaseFactory { 10 | @Autowired 11 | private ApplicationContext context; 12 | /** 13 | * 指定kafka server的地址,集群可配多个,中间,逗号隔开 14 | */ 15 | @Value("${spring.kafka.bootstrap-servers}") 16 | private String bootstrapServersConfig; 17 | /** 18 | * 失败重试发送的次数 19 | */ 20 | @Value("${spring.kafka.producer.retries}") 21 | private Integer retriesConfig; 22 | /** 23 | * 失败重试发送的次数 24 | */ 25 | @Value("${spring.kafka.producer.acks}") 26 | private String acksConfig; 27 | 28 | /** 29 | * 控制批处理大小,单位为字节 30 | */ 31 | @Value("${spring.kafka.producer.batch-size}") 32 | private String batchSizeConfig; 33 | 34 | /** 35 | * 批量发送,延迟为1毫秒,启用该功能能有效减少生产者发送消息次数,从而提高并发量 36 | */ 37 | @Value("${spring.kafka.producer.linger-ms}") 38 | private String lingerMSConfig; 39 | 40 | /** 41 | * 设置自动提交offset 42 | */ 43 | @Value("${spring.kafka.consumer.enable-auto-commit}") 44 | private Boolean EnableAutoCommitConfig; 45 | 46 | /** 47 | * 控制单次调用call方法能够返回的记录数量,帮助控制在轮询里需要处理的数据量 48 | */ 49 | @Value("${spring.kafka.consumer.properties.max.poll.records}") 50 | private Integer MaxPollRecordsConfig; 51 | 52 | /** 53 | * 默认消费者group id 54 | */ 55 | @Value("${spring.kafka.consumer.group-id}") 56 | private String groupID; 57 | 58 | /** 59 | * Session过期时间 60 | */ 61 | @Value("${spring.kafka.consumer.session-timeout}") 62 | private String sessionTimeOut; 63 | 64 | /** 65 | * 分区策略 66 | */ 67 | @Value("${spring.kafka.partition-strategy}") 68 | private String partitionStrategy; 69 | } 70 | -------------------------------------------------------------------------------- /com-hadoop-kafka-demo/src/main/java/com/hadoop/kafka/handler/KafkaSendResultHandler.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.kafka.handler; 2 | 3 | import org.apache.kafka.clients.producer.ProducerRecord; 4 | import org.apache.kafka.clients.producer.RecordMetadata; 5 | import org.slf4j.Logger; 6 | import org.slf4j.LoggerFactory; 7 | import org.springframework.kafka.support.ProducerListener; 8 | import org.springframework.stereotype.Component; 9 | 10 | /** 11 | * 消息结果回调 12 | */ 13 | @Component 14 | public class KafkaSendResultHandler implements ProducerListener> { 15 | 16 | private static final Logger log = LoggerFactory.getLogger(KafkaSendResultHandler.class); 17 | 18 | /** 19 | * 消息发送成功回调 20 | * 21 | * @param producerRecord 22 | * @param recordMetadata 23 | */ 24 | @Override 25 | public void onSuccess(ProducerRecord producerRecord, RecordMetadata recordMetadata) { 26 | log.info("---->消息发送成功回调 : " + producerRecord.toString()); 27 | } 28 | 29 | /** 30 | * 消息发送失败回调 31 | * 32 | * @param producerRecord 33 | * @param exception 34 | */ 35 | @Override 36 | public void onError(ProducerRecord producerRecord, Exception exception) { 37 | log.info("---->消息发送失败回调 : " + producerRecord.toString()); 38 | } 39 | } -------------------------------------------------------------------------------- /com-hadoop-kafka-demo/src/main/java/com/hadoop/kafka/listener/ConsumerListener.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.kafka.listener; 2 | 3 | import com.hadoop.kafka.handler.KafkaConsumerResultHandler; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.apache.kafka.clients.consumer.ConsumerRecord; 6 | import org.springframework.kafka.listener.MessageListener; 7 | import org.springframework.stereotype.Component; 8 | 9 | /** 10 | * 默认生产者监听器 11 | */ 12 | @Slf4j 13 | @Component 14 | public class ConsumerListener implements MessageListener { 15 | 16 | /** 17 | * 消费消息 18 | * 19 | * @param consumerRecord 消息 20 | */ 21 | @Override 22 | public void onMessage(ConsumerRecord consumerRecord) { 23 | KafkaConsumerResultHandler consumerData = new KafkaConsumerResultHandler(consumerRecord); 24 | try { 25 | log.info("---------默认生产者监听器收到消息-----------"); 26 | String result = consumerData.call(); 27 | log.info(result); 28 | } catch (Exception e) { 29 | e.printStackTrace(); 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /com-hadoop-kafka-demo/src/main/java/com/hadoop/kafka/mapper/UserOrderMapper.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.kafka.mapper; 2 | 3 | import com.hadoop.kafka.entity.UserOrderEntity; 4 | import org.mapstruct.Mapper; 5 | 6 | import java.util.List; 7 | 8 | @Mapper 9 | public interface UserOrderMapper { 10 | /** 11 | * 插入用户订单 12 | * 13 | * @param entity 14 | * @return 15 | */ 16 | int upInsertUserOrder(UserOrderEntity entity); 17 | 18 | /** 19 | * 删除指定订单 20 | * 21 | * @param id 22 | * @return 23 | */ 24 | int deleteUserOrder(String id); 25 | 26 | /** 27 | * 获取指定订单信息 28 | * 29 | * @param id 30 | * @return 31 | */ 32 | UserOrderEntity getOrderById(String id); 33 | 34 | /** 35 | * 获取指定用户订单 36 | * 37 | * @param userId 38 | * @return 39 | */ 40 | List getOrdersByUserId(String userId); 41 | 42 | /** 43 | * 获取所有订单信息 44 | * 45 | * @return 46 | */ 47 | List getAllOrders(); 48 | } 49 | -------------------------------------------------------------------------------- /com-hadoop-kafka-demo/src/main/java/com/hadoop/kafka/model/UserLog.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.kafka.model; 2 | 3 | import lombok.Data; 4 | import lombok.experimental.Accessors; 5 | 6 | import java.io.Serializable; 7 | 8 | /** 9 | * 用户日志信息 10 | */ 11 | @Data 12 | @Accessors 13 | public class UserLog implements Serializable { 14 | private static final long serialVersionUID = 5071239632319759222L; 15 | private String username; 16 | private String userId; 17 | private String state; 18 | private String content; 19 | } -------------------------------------------------------------------------------- /com-hadoop-kafka-demo/src/main/java/com/hadoop/kafka/model/UserOrder.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.kafka.model; 2 | 3 | import lombok.Data; 4 | 5 | import java.io.Serializable; 6 | 7 | /** 8 | * 用户订单信息 9 | */ 10 | @Data 11 | public class UserOrder implements Serializable { 12 | private static final long serialVersionUID = 5071239632319759223L; 13 | private String orderID; 14 | private String userID; 15 | private String number; 16 | private Double price; 17 | private String productID; 18 | } 19 | -------------------------------------------------------------------------------- /com-hadoop-kafka-demo/src/main/java/com/hadoop/kafka/processor/UserLogProcessor.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.kafka.processor; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.apache.kafka.streams.processor.Processor; 5 | import org.apache.kafka.streams.processor.ProcessorContext; 6 | 7 | /** 8 | * 具体业务处理 9 | */ 10 | @Slf4j 11 | public class UserLogProcessor implements Processor { 12 | 13 | private ProcessorContext context; 14 | 15 | //初始化 16 | @Override 17 | public void init(ProcessorContext processorContext) { 18 | this.context = processorContext; 19 | this.context.schedule(1000); 20 | } 21 | 22 | /** 23 | * 处理,实时处理,每条都调用这个 24 | * 25 | * @param key 26 | * @param value 27 | */ 28 | @Override 29 | public void process(byte[] key, byte[] value) { 30 | String input = new String(value); 31 | log.info("---> 当前from topic的内容: {}",input); 32 | // 如果包含“>>>”则只保留该标记后面的内容 33 | if (input.contains(">>>")) { 34 | input = input.split(">>>")[1].trim(); 35 | } 36 | log.info("---> 输出到下一个to topic的内容: {}",input); 37 | // 输出到下一个topic 38 | context.forward("userLogProcessor".getBytes(), input.getBytes()); 39 | } 40 | 41 | @Override 42 | public void punctuate(long l) { 43 | 44 | } 45 | 46 | //释放资源 47 | @Override 48 | public void close() { 49 | 50 | } 51 | } -------------------------------------------------------------------------------- /com-hadoop-kafka-demo/src/main/java/com/hadoop/kafka/producer/UserLogProducer.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.kafka.producer; 2 | 3 | import com.alibaba.fastjson.JSON; 4 | import com.hadoop.kafka.common.TopicConstant; 5 | import com.hadoop.kafka.handler.KafkaSendResultHandler; 6 | import com.hadoop.kafka.model.UserLog; 7 | import lombok.extern.slf4j.Slf4j; 8 | import org.apache.kafka.clients.producer.ProducerRecord; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.kafka.core.KafkaTemplate; 11 | import org.springframework.stereotype.Component; 12 | 13 | /** 14 | * 用户日志生产者 15 | */ 16 | @Slf4j 17 | @Component 18 | public class UserLogProducer { 19 | @Autowired 20 | private KafkaTemplate kafkaTemplate; 21 | @Autowired 22 | private KafkaSendResultHandler producerListener; 23 | 24 | /** 25 | * 发送消息 26 | * 27 | * @param userLog 28 | */ 29 | public void sendlog(UserLog userLog) { 30 | try { 31 | log.info("---->准备发送用户日志到消息服务:{}", JSON.toJSONString(userLog)); 32 | 33 | // 指定key让kafka自动判断partition 34 | String key = userLog.getUserId(); 35 | ProducerRecord record = new ProducerRecord<>( 36 | TopicConstant.USER_LOG_TOPIC_MESSAGE, 37 | key, 38 | JSON.toJSONString(userLog)); 39 | 40 | kafkaTemplate.setProducerListener(producerListener); 41 | kafkaTemplate.send(record); 42 | } catch (Exception ex) { 43 | ex.printStackTrace(); 44 | } 45 | } 46 | } -------------------------------------------------------------------------------- /com-hadoop-kafka-demo/src/main/java/com/hadoop/kafka/producer/UserOrderProducer.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.kafka.producer; 2 | 3 | import com.alibaba.fastjson.JSON; 4 | import com.hadoop.kafka.common.TopicConstant; 5 | import com.hadoop.kafka.model.UserOrder; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.apache.kafka.clients.producer.ProducerRecord; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.beans.factory.annotation.Qualifier; 10 | import org.springframework.kafka.core.KafkaTemplate; 11 | import org.springframework.stereotype.Component; 12 | 13 | @Slf4j 14 | @Component 15 | public class UserOrderProducer { 16 | 17 | @Autowired 18 | @Qualifier("customerKafkaTemplate") 19 | private KafkaTemplate kafkaTemplate; 20 | 21 | /** 22 | * 发送消息 23 | * 24 | * @param userOrder 25 | */ 26 | public void sendOrder(UserOrder userOrder) { 27 | try { 28 | log.info("---->准备发送用户订单到消息服务:{}", JSON.toJSONString(userOrder)); 29 | 30 | // 使用OrderID哈希值对主题分区数量取模,让数据发送到不同的分区,达到负载均衡,提高kafka的吞吐量. 31 | String key = userOrder.getOrderID(); 32 | //int hCode = key.hashCode(); 33 | // 这里是分8个分片;需要注意的是hashcode有可能为负数;可以通过&操作; 34 | // 或者直接Math.Abs(hCode%2)也可以 35 | //int partitionNum = (hCode & 0x7fffffff) % 8; 36 | //log.info("---->计算出主题分区是:{}", partitionNum); 37 | // 发送内容(计算分区由com.hadoop.kafka.config.PartitionStrategyConfig计算) 38 | ProducerRecord record = new ProducerRecord<>( 39 | TopicConstant.USER_ORDER_TOPIC_MESSAGE, 40 | //partitionNum, 41 | key, 42 | JSON.toJSONString(userOrder)); 43 | 44 | kafkaTemplate.send(record); 45 | 46 | } catch (Exception ex) { 47 | ex.printStackTrace(); 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /com-hadoop-kafka-demo/src/main/java/com/hadoop/kafka/service/UserOrderService.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.kafka.service; 2 | 3 | import com.hadoop.kafka.model.UserOrder; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * 用户订单服务 9 | */ 10 | public interface UserOrderService { 11 | /** 12 | * 插入用户订单 13 | * 14 | * @param userOrder 15 | * @return 16 | */ 17 | int upInsertUserOrder(UserOrder userOrder) throws Exception; 18 | 19 | /** 20 | * 删除指定订单 21 | * 22 | * @param id 23 | * @return 24 | */ 25 | int deleteUserOrder(String id); 26 | 27 | /** 28 | * 获取指定订单信息 29 | * 30 | * @param id 31 | * @return 32 | */ 33 | UserOrder getOrderById(String id); 34 | 35 | /** 36 | * 获取指定用户订单 37 | * 38 | * @param userId 39 | * @return 40 | */ 41 | List getOrdersByUserId(String userId); 42 | 43 | /** 44 | * 获取所有订单信息 45 | * 46 | * @return 47 | */ 48 | List getAllOrders(); 49 | } 50 | -------------------------------------------------------------------------------- /com-hadoop-kafka-demo/src/main/resources/mapper/UserOrderMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | UPSERT INTO USER_ORDER VALUES ( 8 | #{orderID}, 9 | #{userID}, 10 | #{number}, 11 | #{price}, 12 | #{productID} 13 | ) 14 | 15 | 16 | DELETE 17 | FROM USER_ORDER 18 | WHERE order_id = #{orderID} 19 | 20 | 25 | 29 | 34 | -------------------------------------------------------------------------------- /com-hadoop-spark-demo/src/main/java/com/hadoop/spark/SpringBootHadoopSparkApplication.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.spark; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.scheduling.annotation.EnableScheduling; 6 | 7 | @EnableScheduling 8 | @SpringBootApplication 9 | public class SpringBootHadoopSparkApplication { 10 | 11 | public static void main(String[] args) { 12 | SpringApplication.run(SpringBootHadoopSparkApplication.class, args); 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /com-hadoop-spark-demo/src/main/java/com/hadoop/spark/common/SpringContextHolder.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.spark.common; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.springframework.beans.BeansException; 5 | import org.springframework.context.ApplicationContext; 6 | import org.springframework.context.ApplicationContextAware; 7 | import org.springframework.stereotype.Component; 8 | 9 | @Slf4j 10 | @Component 11 | public class SpringContextHolder implements ApplicationContextAware { 12 | 13 | private static ApplicationContext applicationContext; 14 | 15 | @Override 16 | public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 17 | if (null == SpringContextHolder.applicationContext) { 18 | log.info("------------>applicationContext正在初始化,application:" + applicationContext); 19 | SpringContextHolder.applicationContext = applicationContext; 20 | } 21 | } 22 | 23 | public static ApplicationContext getApplicationContext() { 24 | if (SpringContextHolder.applicationContext == null) { 25 | throw new RuntimeException("applicaitonContext属性为null,请检查是否注入了SpringContextHolder!"); 26 | } 27 | return applicationContext; 28 | } 29 | 30 | public static T getBean(Class clazz) { 31 | return getApplicationContext().getBean(clazz); 32 | } 33 | 34 | public static T getBean(String name, Class clazz) { 35 | return getApplicationContext().getBean(name, clazz); 36 | } 37 | } -------------------------------------------------------------------------------- /com-hadoop-spark-demo/src/main/java/com/hadoop/spark/config/SparkConfig.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.spark.config; 2 | 3 | import org.apache.spark.SparkConf; 4 | import org.apache.spark.api.java.JavaSparkContext; 5 | import org.apache.spark.sql.SparkSession; 6 | import org.apache.spark.sql.hive.HiveContext; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; 9 | import org.springframework.context.annotation.Bean; 10 | import org.springframework.context.annotation.Configuration; 11 | 12 | /** 13 | * spark 配置类 14 | */ 15 | @Configuration 16 | public class SparkConfig { 17 | 18 | @Autowired 19 | private SparkProperties sparkProperties; 20 | 21 | @Bean 22 | @ConditionalOnMissingBean(SparkConf.class) 23 | public SparkConf sparkConf() { 24 | return new SparkConf() 25 | // 设置模式为本地模式 [*] 为使用本机核数 26 | .setMaster(sparkProperties.getMaster()) 27 | // 设置应用名 28 | .setAppName(sparkProperties.getAppName()) 29 | .setSparkHome(sparkProperties.getSparkHome()); 30 | } 31 | 32 | @Autowired 33 | private SparkConf sparkConf; 34 | 35 | @Bean 36 | @ConditionalOnMissingBean(JavaSparkContext.class) 37 | public JavaSparkContext javaSparkContext() { 38 | return new JavaSparkContext(sparkConf); 39 | } 40 | 41 | @Autowired 42 | private JavaSparkContext javaSparkContext; 43 | 44 | @Bean 45 | @ConditionalOnMissingBean(SparkSession.class) 46 | public SparkSession sqlContext() { 47 | return new SparkSession(javaSparkContext.sc()); 48 | } 49 | 50 | /** 51 | * HiveContext也是已经过时的不推荐使用 52 | * 53 | * @return 54 | */ 55 | @Bean 56 | @ConditionalOnMissingBean(HiveContext.class) 57 | public HiveContext hiveContext() { 58 | return new HiveContext(javaSparkContext()); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /com-hadoop-spark-demo/src/main/java/com/hadoop/spark/config/SparkProperties.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.spark.config; 2 | 3 | import lombok.Data; 4 | import org.springframework.boot.context.properties.ConfigurationProperties; 5 | import org.springframework.stereotype.Service; 6 | 7 | @Service 8 | @ConfigurationProperties(prefix = "spark") 9 | @Data 10 | public class SparkProperties { 11 | private String appName; 12 | 13 | private String master; 14 | 15 | private String sparkHome; 16 | } 17 | -------------------------------------------------------------------------------- /com-hadoop-spark-demo/src/main/java/com/hadoop/spark/domain/WordCount.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.spark.domain; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.ToString; 6 | 7 | import java.io.Serializable; 8 | 9 | @Data 10 | @ToString 11 | @AllArgsConstructor 12 | public class WordCount implements Serializable { 13 | private String word; 14 | private Integer count; 15 | } 16 | -------------------------------------------------------------------------------- /com-hadoop-spark-demo/src/main/java/com/hadoop/spark/job/AbstractSparkJob.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.spark.job; 2 | 3 | import com.hadoop.spark.common.SpringContextHolder; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.apache.spark.api.java.JavaSparkContext; 6 | 7 | import java.io.Serializable; 8 | 9 | /** 10 | * 抽象job 11 | */ 12 | @Slf4j 13 | public abstract class AbstractSparkJob implements Serializable { 14 | 15 | /** 16 | * java.io.NotSerializableException: org.apache.spark.api.java.JavaSparkContext 17 | * sparkcontext无法被序列化的问题 当我们在使用RDD调用map等算子,或者Dstream使用transform时, 18 | * 我们需要在它们的重写的方法里面,需要利用sparkcontext 19 | * 比如把一个集合转化为RDD,但是一运行就报java.io.NotSerializableException: 20 | * org.apache.spark.api.java.JavaSparkContext(sparkcontext序列化异常) 21 | *

22 | * 因为它是不能序列化的,这时候我们使用static修飾解決該問題 23 | */ 24 | private static ThreadLocal threadLocal = new ThreadLocal() { 25 | protected JavaSparkContext initialValue() { 26 | return SpringContextHolder.getBean(JavaSparkContext.class); 27 | } 28 | }; 29 | 30 | protected abstract void execute(JavaSparkContext sparkContext, String[] args); 31 | 32 | protected void close(JavaSparkContext javaSparkContext) { 33 | javaSparkContext.close(); 34 | } 35 | 36 | /** 37 | * 开始执行Spark Job 38 | * 39 | * @param args 40 | */ 41 | public void startJob(String[] args) { 42 | log.info("-------开始执行Job-----------"); 43 | this.execute(threadLocal.get(), args); 44 | //不能關閉 45 | //this.close(sparkContext); 46 | log.info("-------结束执行Job-----------"); 47 | } 48 | 49 | } 50 | -------------------------------------------------------------------------------- /com-hadoop-spark-demo/src/main/java/com/hadoop/spark/job/WordCountJob.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.spark.job; 2 | 3 | import com.hadoop.spark.job.utils.SparkJobUtil; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.apache.spark.api.java.JavaSparkContext; 6 | import org.mortbay.util.ajax.JSON; 7 | import org.springframework.stereotype.Component; 8 | import scala.Tuple2; 9 | 10 | import java.util.Arrays; 11 | import java.util.List; 12 | 13 | @Slf4j 14 | @Component 15 | public class WordCountJob extends AbstractSparkJob { 16 | 17 | @Override 18 | protected void execute(JavaSparkContext sparkContext, String[] args) { 19 | //args[1] 文件路径, 读取文件wordcount后输出 20 | log.info("----------------开始执行 WordCountJob -------------------"); 21 | List> topK = sparkContext.textFile(args[1]) 22 | .flatMap(str -> Arrays.asList(str.split("\n| ")).iterator()) 23 | .mapToPair(word -> new Tuple2<>(word, 1)) 24 | .reduceByKey((integer1, integer2) -> integer1 + integer2) 25 | .filter(tuple2 -> tuple2._1.length() > 0) 26 | //单词与频数倒过来为新二元组,按频数倒排序取途topK 27 | .mapToPair(tuple2 -> new Tuple2<>(tuple2._2, tuple2._1)) 28 | .sortByKey(false) 29 | .take(10); 30 | for (Tuple2 tuple2 : topK) { 31 | log.info("------>Word<----{}", JSON.toString(tuple2)); 32 | } 33 | 34 | SparkJobUtil.judeDirExists(args[2]); 35 | //将结果保存到文本文件 36 | sparkContext.parallelize(topK).coalesce(1).saveAsTextFile(args[2]); 37 | log.info("----------------结束执行 WordCountJob -------------------"); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /com-hadoop-spark-demo/src/main/java/com/hadoop/spark/rdd/LogRDD.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.spark.rdd; 2 | 3 | import com.hadoop.spark.common.SpringContextHolder; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.apache.spark.api.java.JavaRDD; 6 | import org.apache.spark.api.java.JavaSparkContext; 7 | import org.springframework.stereotype.Component; 8 | 9 | import java.io.Serializable; 10 | 11 | @Slf4j 12 | @Component 13 | public class LogRDD implements Serializable { 14 | /** 15 | * java.io.NotSerializableException: org.apache.spark.api.java.JavaSparkContext 16 | * sparkcontext无法被序列化的问题 当我们在使用RDD调用map等算子,或者Dstream使用transform时, 17 | * 我们需要在它们的重写的方法里面,需要利用sparkcontext 18 | * 比如把一个集合转化为RDD,但是一运行就报java.io.NotSerializableException: 19 | * org.apache.spark.api.java.JavaSparkContext(sparkcontext序列化异常) 20 | *

21 | * 因为它是不能序列化的,这时候我们使用static修飾解決該問題 22 | */ 23 | private static ThreadLocal threadLocal = new ThreadLocal() { 24 | protected JavaSparkContext initialValue() { 25 | return SpringContextHolder.getBean(JavaSparkContext.class); 26 | } 27 | }; 28 | 29 | /** 30 | * 统计Error日志个数 31 | * 32 | * @param path 日志文件路径 33 | */ 34 | public void errorLogCounts(String path) { 35 | log.info("-----------開始 執行统计ERROR日志发生次数------------"); 36 | JavaRDD inputRDD = threadLocal.get().textFile(path); 37 | JavaRDD errorsRDD = inputRDD.filter(s -> s.contains("ERROR")); 38 | log.info("-->errors显示为:" + errorsRDD.collect()); 39 | log.info("-->errors个数为:" + errorsRDD.count()); 40 | log.info("-----------結束 執行统计ERROR日志发生次数------------"); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /com-hadoop-spark-demo/src/main/java/com/hadoop/spark/socket/SparkSocketServer.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.spark.socket; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | 5 | import java.io.IOException; 6 | import java.io.OutputStreamWriter; 7 | import java.io.PrintWriter; 8 | import java.net.ServerSocket; 9 | import java.net.Socket; 10 | 11 | /** 12 | * 实现一个Socket Server。在本地启动一个ServerSocket,端口号设为9999,启动后开始监听客户端连接, 13 | * 一旦连接成功,打印客户端地址,然后向客户端推送一串字符串,时间间隔为1秒钟,循环一百次。 14 | */ 15 | @Slf4j 16 | public class SparkSocketServer { 17 | static ServerSocket serverSocket = null; 18 | static PrintWriter pw = null; 19 | private static int port = 9999; 20 | 21 | public static void main(String[] args) { 22 | try { 23 | serverSocket = new ServerSocket(port); 24 | log.info("---Socket 服务启动:{},等待连接-----", serverSocket); 25 | Socket socket = serverSocket.accept(); 26 | log.info("----连接成功,来自:" + socket.getRemoteSocketAddress()); 27 | pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); 28 | int i = 0; 29 | while (i < 500) { 30 | i++; 31 | String str = "spark streaming test " + i; 32 | pw.println(str); 33 | pw.flush(); 34 | log.info("-->服务端发送数据:{}", str); 35 | try { 36 | Thread.sleep(1000L); 37 | } catch (InterruptedException e) { 38 | e.printStackTrace(); 39 | } 40 | } 41 | } catch (IOException e) { 42 | e.printStackTrace(); 43 | } finally { 44 | try { 45 | pw.close(); 46 | serverSocket.close(); 47 | } catch (IOException e) { 48 | e.printStackTrace(); 49 | } 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /com-hadoop-spark-demo/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | #应用名 2 | spring: 3 | application: 4 | name: springboot-bigdata-spark 5 | #端口号 6 | server: 7 | port: 8081 8 | #sparkconfig配置 9 | spark: 10 | app-name: ${spring.application.name} 11 | master: "local[*]" #spark://10.1.2.237:7077 连接不上 12 | spark-home: "/usr/local/spark-1.1.1-bin-hadoop2.4/bin" 13 | -------------------------------------------------------------------------------- /com-hadoop-spark-demo/src/main/resources/jdbc.properties: -------------------------------------------------------------------------------- 1 | db.url=jdbc:mysql://10.1.2.237:3306/spark_demo_data1?useSSL=false&&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8 2 | db.user=root 3 | db.password=root 4 | db.driver=com.mysql.jdbc.Driver 5 | 6 | db.table=user -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/SpringBootHadoopWebApplication.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.data.jpa.repository.config.EnableJpaAuditing; 6 | 7 | @EnableJpaAuditing 8 | @SpringBootApplication 9 | public class SpringBootHadoopWebApplication { 10 | public static void main(String[] args) { 11 | SpringApplication.run(SpringBootHadoopWebApplication.class, args); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/common/Result.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.common; 2 | 3 | 4 | import lombok.Data; 5 | 6 | /** 7 | * API 统一返回结果 8 | * 9 | * @param 10 | */ 11 | @Data 12 | public class Result { 13 | 14 | /** 15 | * 响应码 16 | */ 17 | private Integer resCode; 18 | 19 | /** 20 | * 错误码 21 | */ 22 | private String errCode; 23 | 24 | /** 25 | * 错误信息 26 | */ 27 | private String errMsg; 28 | 29 | /** 30 | * 数据 31 | */ 32 | private T data; 33 | 34 | public Result(Integer resCode, String errCode, String errMsg, T data) { 35 | this.resCode = resCode; 36 | this.errCode = errCode; 37 | this.errMsg = errMsg; 38 | this.data = data; 39 | } 40 | } -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/config/Swagger2Config.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.config; 2 | 3 | 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | import org.springframework.web.bind.annotation.RestController; 7 | import springfox.documentation.builders.ApiInfoBuilder; 8 | import springfox.documentation.builders.PathSelectors; 9 | import springfox.documentation.builders.RequestHandlerSelectors; 10 | import springfox.documentation.service.ApiInfo; 11 | import springfox.documentation.service.Contact; 12 | import springfox.documentation.spi.DocumentationType; 13 | import springfox.documentation.spring.web.plugins.Docket; 14 | import springfox.documentation.swagger2.annotations.EnableSwagger2; 15 | 16 | import java.time.LocalDateTime; 17 | import java.util.Date; 18 | 19 | @Configuration 20 | @EnableSwagger2 21 | public class Swagger2Config { 22 | 23 | /** 24 | * Swagger组件注册 25 | */ 26 | @Bean 27 | public Docket api() { 28 | return new Docket(DocumentationType.SWAGGER_2) 29 | .apiInfo(apiInfo()) 30 | .select() 31 | .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class)) 32 | .paths(PathSelectors.any()) 33 | .build() 34 | .directModelSubstitute(LocalDateTime.class, Date.class); 35 | } 36 | 37 | private ApiInfo apiInfo() { 38 | return new ApiInfoBuilder() 39 | .title("犇犇大数据仓库可视化数据接口1.0") 40 | .description("查询Hive计算结果,数据由Hive ADS层通过Sqoop同步到MySQL相同表结构中存储,以便可视化查询和显示。") 41 | .termsOfServiceUrl("http://localhost:8080/swagger-ui.html") 42 | .contact(new Contact("何涌", "", "heyong@9fstock.com")) 43 | .version("1.0") 44 | .build(); 45 | } 46 | } -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/controller/BackCountController.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.controller; 2 | 3 | import com.hadoop.web.common.Result; 4 | import com.hadoop.web.common.ResultUtil; 5 | import com.hadoop.web.model.BackCountModel; 6 | import com.hadoop.web.service.BackCountService; 7 | import io.swagger.annotations.Api; 8 | import io.swagger.annotations.ApiOperation; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.web.bind.annotation.RequestMapping; 11 | import org.springframework.web.bind.annotation.RequestMethod; 12 | import org.springframework.web.bind.annotation.RestController; 13 | 14 | import java.util.List; 15 | 16 | @Api(tags = "BackCountController", description = "本周回流用户数统计表") 17 | @RestController 18 | @RequestMapping("/api/v1/backCount") 19 | public class BackCountController { 20 | 21 | @Autowired 22 | private BackCountService backCountService; 23 | 24 | @ApiOperation("获取所有回流用户数统计表") 25 | @RequestMapping(path = "/findAll", method = RequestMethod.GET) 26 | public Result> findAll() { 27 | List backCounts = backCountService.findAll(); 28 | return ResultUtil.success(backCounts); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/controller/ContinuityUVCountController.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.controller; 2 | 3 | import com.hadoop.web.common.Result; 4 | import com.hadoop.web.common.ResultUtil; 5 | import com.hadoop.web.model.ContinuityUVCountModel; 6 | import com.hadoop.web.service.ContinuityUVCountService; 7 | import io.swagger.annotations.Api; 8 | import io.swagger.annotations.ApiOperation; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.web.bind.annotation.RequestMapping; 11 | import org.springframework.web.bind.annotation.RequestMethod; 12 | import org.springframework.web.bind.annotation.RestController; 13 | 14 | import java.util.List; 15 | 16 | @Api(tags = "ContinuityUVCountController", description = "连续活跃设备数") 17 | @RestController 18 | @RequestMapping("/api/v1/continuityUVCount") 19 | public class ContinuityUVCountController { 20 | 21 | @Autowired 22 | private ContinuityUVCountService continuityUVCountService; 23 | 24 | @ApiOperation("获取所有连续活跃设备数") 25 | @RequestMapping(path = "/findAll", method = RequestMethod.GET) 26 | public Result> findAll() { 27 | List continuityUVCounts = continuityUVCountService.findAll(); 28 | return ResultUtil.success(continuityUVCounts); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/controller/ContinuityWKCountController.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.controller; 2 | 3 | import com.hadoop.web.common.Result; 4 | import com.hadoop.web.common.ResultUtil; 5 | import com.hadoop.web.model.ContinuityWKCountModel; 6 | import com.hadoop.web.service.ContinuityWKCountService; 7 | import io.swagger.annotations.Api; 8 | import io.swagger.annotations.ApiOperation; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.web.bind.annotation.RequestMapping; 11 | import org.springframework.web.bind.annotation.RequestMethod; 12 | import org.springframework.web.bind.annotation.RestController; 13 | 14 | import java.util.List; 15 | 16 | @Api(tags = "ContinuityWKCountController", description = "最近连续三周活跃用户数统计") 17 | @RestController 18 | @RequestMapping("/api/v1/continuityWKCount") 19 | public class ContinuityWKCountController { 20 | @Autowired 21 | private ContinuityWKCountService continuityWKCountService; 22 | 23 | @ApiOperation("获取所有最近连续三周活跃用户数") 24 | @RequestMapping(path = "/findAll", method = RequestMethod.GET) 25 | public Result> findAll() { 26 | List continuityWKCounts = continuityWKCountService.findAll(); 27 | return ResultUtil.success(continuityWKCounts); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/controller/NewMIDCountController.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.controller; 2 | 3 | import com.hadoop.web.common.Result; 4 | import com.hadoop.web.common.ResultUtil; 5 | import com.hadoop.web.model.NewMIDCountModel; 6 | import com.hadoop.web.service.NewMIDCountService; 7 | import io.swagger.annotations.Api; 8 | import io.swagger.annotations.ApiOperation; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.web.bind.annotation.RequestMapping; 11 | import org.springframework.web.bind.annotation.RequestMethod; 12 | import org.springframework.web.bind.annotation.RestController; 13 | 14 | import java.util.List; 15 | 16 | @Api(tags = "NewMIDCountController", description = "每日新增设备信息数量统计表") 17 | @RestController 18 | @RequestMapping("/api/v1/newMIDCount") 19 | public class NewMIDCountController { 20 | 21 | @Autowired 22 | private NewMIDCountService newMIDCountService; 23 | 24 | @ApiOperation("获取所有最近连续三周活跃用户数") 25 | @RequestMapping(path = "/findAll", method = RequestMethod.GET) 26 | public Result> findAll() { 27 | List newMIDCounts = newMIDCountService.findAll(); 28 | return ResultUtil.success(newMIDCounts); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/controller/SilentCountController.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.controller; 2 | 3 | import com.hadoop.web.common.Result; 4 | import com.hadoop.web.common.ResultUtil; 5 | import com.hadoop.web.model.SilentCountModel; 6 | import com.hadoop.web.service.SilentCountService; 7 | import io.swagger.annotations.Api; 8 | import io.swagger.annotations.ApiOperation; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.web.bind.annotation.RequestMapping; 11 | import org.springframework.web.bind.annotation.RequestMethod; 12 | import org.springframework.web.bind.annotation.RestController; 13 | 14 | import java.util.List; 15 | 16 | @Api(tags = "SilentCountController", description = "沉默用户数统计表") 17 | @RestController 18 | @RequestMapping("/api/v1/silentCount") 19 | public class SilentCountController { 20 | 21 | @Autowired 22 | private SilentCountService silentCountService; 23 | 24 | @ApiOperation("获取所有沉默用户数") 25 | @RequestMapping(path = "/findAll", method = RequestMethod.GET) 26 | public Result> findAll() { 27 | List silentCounts = silentCountService.findAll(); 28 | return ResultUtil.success(silentCounts); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/controller/UVCountController.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.controller; 2 | 3 | import com.hadoop.web.common.Result; 4 | import com.hadoop.web.common.ResultUtil; 5 | import com.hadoop.web.model.UVCountModel; 6 | import com.hadoop.web.service.UVCountService; 7 | import io.swagger.annotations.Api; 8 | import io.swagger.annotations.ApiOperation; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.web.bind.annotation.RequestMapping; 11 | import org.springframework.web.bind.annotation.RequestMethod; 12 | import org.springframework.web.bind.annotation.RestController; 13 | 14 | import java.util.List; 15 | 16 | @Api(tags = "UVCountController", description = "活跃设备数统计表") 17 | @RestController 18 | @RequestMapping("/api/v1/uvCount") 19 | public class UVCountController { 20 | @Autowired 21 | private UVCountService uvCountService; 22 | 23 | @ApiOperation("获取所有活跃设备数") 24 | @RequestMapping(path = "/findAll", method = RequestMethod.GET) 25 | public Result> findAll() { 26 | List uvCounts = uvCountService.findAll(); 27 | return ResultUtil.success(uvCounts); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/controller/UserRetentionDayRateController.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.controller; 2 | 3 | import com.hadoop.web.common.Result; 4 | import com.hadoop.web.common.ResultUtil; 5 | import com.hadoop.web.model.UserRetentionDayRateModel; 6 | import com.hadoop.web.service.UserRetentionDayRateService; 7 | import io.swagger.annotations.Api; 8 | import io.swagger.annotations.ApiOperation; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.web.bind.annotation.RequestMapping; 11 | import org.springframework.web.bind.annotation.RequestMethod; 12 | import org.springframework.web.bind.annotation.RestController; 13 | 14 | import java.util.List; 15 | 16 | @Api(tags = "UserRetentionDayRateController", description = "每日用户留存情况统计表") 17 | @RestController 18 | @RequestMapping("/api/v1/userRetentionDayRate") 19 | public class UserRetentionDayRateController { 20 | 21 | @Autowired 22 | private UserRetentionDayRateService userRetentionDayRateService; 23 | 24 | @ApiOperation("获取每日用户留存情况") 25 | @RequestMapping(path = "/findAll", method = RequestMethod.GET) 26 | public Result> findAll() { 27 | List userRetentionDayRates = userRetentionDayRateService.findAll(); 28 | return ResultUtil.success(userRetentionDayRates); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/controller/WastageCountController.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.controller; 2 | 3 | import com.hadoop.web.common.Result; 4 | import com.hadoop.web.common.ResultUtil; 5 | import com.hadoop.web.model.WastageCountModel; 6 | import com.hadoop.web.service.WastageCountService; 7 | import io.swagger.annotations.Api; 8 | import io.swagger.annotations.ApiOperation; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.web.bind.annotation.RequestMapping; 11 | import org.springframework.web.bind.annotation.RequestMethod; 12 | import org.springframework.web.bind.annotation.RestController; 13 | 14 | import java.util.List; 15 | 16 | @Api(tags = "WastageCountController", description = "流失用户数统计表") 17 | @RestController 18 | @RequestMapping("/api/v1/wastageCount") 19 | public class WastageCountController { 20 | 21 | @Autowired 22 | private WastageCountService wastageCountService; 23 | 24 | @ApiOperation("获取所有流失用户数") 25 | @RequestMapping(path = "/findAll", method = RequestMethod.GET) 26 | public Result> findAll() { 27 | List wastageCounts = wastageCountService.findAll(); 28 | return ResultUtil.success(wastageCounts); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/entity/BackCount.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.entity; 2 | 3 | import lombok.Data; 4 | 5 | import javax.persistence.Column; 6 | import javax.persistence.EmbeddedId; 7 | import javax.persistence.Entity; 8 | import javax.persistence.Table; 9 | 10 | /** 11 | * 本周回流用户数统计表 12 | */ 13 | @Data 14 | @Entity 15 | @Table(name = "ads_back_count") 16 | public class BackCount { 17 | 18 | /** 19 | * 统计日期 20 | */ 21 | @EmbeddedId 22 | private DateTimePrimaryKey dateTime; 23 | 24 | /** 25 | * 回流用户数 26 | */ 27 | @Column(name = "wastage_count") 28 | private int wastageCount; 29 | } 30 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/entity/CompositePrimaryKey.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.entity; 2 | 3 | import lombok.Data; 4 | 5 | import javax.persistence.Column; 6 | import javax.persistence.Embeddable; 7 | import java.io.Serializable; 8 | 9 | /** 10 | * 复合主键类 11 | */ 12 | @Data 13 | @Embeddable 14 | public class CompositePrimaryKey implements Serializable { 15 | /** 16 | * 统计日期 17 | */ 18 | @Column(name = "stat_date", nullable = false) 19 | private String dateTime; 20 | 21 | /** 22 | * 设备新增日期 23 | */ 24 | @Column(name = "create_date", nullable = false) 25 | private String createDate; 26 | } 27 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/entity/ContinuityUVCount.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.entity; 2 | 3 | import lombok.Data; 4 | 5 | import javax.persistence.Column; 6 | import javax.persistence.EmbeddedId; 7 | import javax.persistence.Entity; 8 | import javax.persistence.Table; 9 | 10 | /** 11 | * 连续活跃设备数 12 | */ 13 | @Data 14 | @Entity 15 | @Table(name = "ads_continuity_uv_count") 16 | public class ContinuityUVCount { 17 | /** 18 | * 统计日期 19 | */ 20 | @EmbeddedId 21 | private DateTimePrimaryKey dateTime; 22 | 23 | /** 24 | * 最近 7 天日期 25 | */ 26 | @Column(name = "wk_dt", nullable = true) 27 | private String weekDateTime; 28 | 29 | /** 30 | * 连续活跃设备数 31 | */ 32 | @Column(name = "continuity_count", nullable = true) 33 | private int continuityCount; 34 | } 35 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/entity/ContinuityWKCount.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.entity; 2 | 3 | import lombok.Data; 4 | 5 | import javax.persistence.Column; 6 | import javax.persistence.EmbeddedId; 7 | import javax.persistence.Entity; 8 | import javax.persistence.Table; 9 | 10 | /** 11 | * 最近连续三周活跃用户数统计 12 | */ 13 | @Data 14 | @Entity 15 | @Table(name = "ads_continuity_wk_count") 16 | public class ContinuityWKCount { 17 | /** 18 | * 统计日期 19 | */ 20 | @EmbeddedId 21 | private DateTimePrimaryKey dateTime; 22 | 23 | /** 24 | * 最近 7 天日期 25 | */ 26 | @Column(name = "wk_dt", nullable = true) 27 | private String weekDateTime; 28 | 29 | /** 30 | * 连续活跃设备数 31 | */ 32 | @Column(name = "continuity_count", nullable = true) 33 | private int continuityCount; 34 | } 35 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/entity/CreateDatePrimaryKey.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.entity; 2 | 3 | import lombok.Data; 4 | 5 | import javax.persistence.Column; 6 | import javax.persistence.Embeddable; 7 | import java.io.Serializable; 8 | 9 | @Data 10 | @Embeddable 11 | public class CreateDatePrimaryKey implements Serializable { 12 | @Column(name = "create_date", nullable = false) 13 | private String createDate; 14 | } 15 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/entity/DateTimePrimaryKey.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.entity; 2 | 3 | import lombok.Data; 4 | 5 | import javax.persistence.Column; 6 | import javax.persistence.Embeddable; 7 | import java.io.Serializable; 8 | 9 | @Data 10 | @Embeddable 11 | public class DateTimePrimaryKey implements Serializable { 12 | @Column(name = "dt", nullable = false) 13 | private String dateTime; 14 | } 15 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/entity/NewMIDCount.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.entity; 2 | 3 | import lombok.Data; 4 | 5 | import javax.persistence.Column; 6 | import javax.persistence.EmbeddedId; 7 | import javax.persistence.Entity; 8 | import javax.persistence.Table; 9 | 10 | /** 11 | * 每日新增设备信息数量统计表 12 | */ 13 | @Data 14 | @Entity 15 | @Table(name = "ads_new_mid_count") 16 | public class NewMIDCount { 17 | /** 18 | * 统计日期 19 | */ 20 | @EmbeddedId 21 | private CreateDatePrimaryKey createDate; 22 | 23 | /** 24 | * 每日新增设备信息数量 25 | */ 26 | @Column(name = "new_mid_count") 27 | private int newMidCount; 28 | } 29 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/entity/SilentCount.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.entity; 2 | 3 | import lombok.Data; 4 | 5 | import javax.persistence.Column; 6 | import javax.persistence.EmbeddedId; 7 | import javax.persistence.Entity; 8 | import javax.persistence.Table; 9 | 10 | /** 11 | * 沉默用户数统计表 12 | */ 13 | @Data 14 | @Entity 15 | @Table(name = "ads_silent_count") 16 | public class SilentCount { 17 | /** 18 | * 统计日期 19 | */ 20 | @EmbeddedId 21 | private DateTimePrimaryKey dateTime; 22 | 23 | /** 24 | * 沉默设备数 25 | */ 26 | @Column(name = "silent_count") 27 | private int silentCount; 28 | } 29 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/entity/UVCount.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.entity; 2 | 3 | import lombok.Data; 4 | 5 | import javax.persistence.Column; 6 | import javax.persistence.EmbeddedId; 7 | import javax.persistence.Entity; 8 | import javax.persistence.Table; 9 | 10 | /** 11 | * 活跃设备数统计表 12 | */ 13 | @Data 14 | @Entity 15 | @Table(name = "ads_uv_count") 16 | public class UVCount { 17 | /** 18 | * 统计日期 19 | */ 20 | @EmbeddedId 21 | private DateTimePrimaryKey dateTime; 22 | 23 | /** 24 | * 当日用户数量 25 | */ 26 | @Column(name = "day_count") 27 | private int dayCount; 28 | 29 | /** 30 | * 当周用户数量 31 | */ 32 | @Column(name = "wk_count") 33 | private int wkCount; 34 | 35 | /** 36 | * 当月用户数量 37 | */ 38 | @Column(name = "mn_count") 39 | private int mnCount; 40 | 41 | /** 42 | * Y,N 是否是周末,用于得到本周最终结果 43 | */ 44 | @Column(name = "is_weekend") 45 | private String isWeekend; 46 | 47 | /** 48 | * Y,N 是否是月末,用于得到本月最终结果 49 | */ 50 | @Column(name = "is_monthend") 51 | private String isMonthend; 52 | } 53 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/entity/UserRetentionDayRate.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.entity; 2 | 3 | import lombok.Data; 4 | 5 | import javax.persistence.Column; 6 | import javax.persistence.EmbeddedId; 7 | import javax.persistence.Entity; 8 | import javax.persistence.Table; 9 | import java.math.BigDecimal; 10 | import java.math.BigInteger; 11 | 12 | /** 13 | * 每日用户留存情况统计表 14 | */ 15 | @Data 16 | @Entity 17 | @Table(name = "ads_user_retention_day_rate") 18 | public class UserRetentionDayRate { 19 | 20 | /** 21 | * 复合主键要用这个注解 22 | */ 23 | @EmbeddedId 24 | private CompositePrimaryKey date; 25 | 26 | /** 27 | * 截止当前日期留存天数 28 | */ 29 | @Column(name = "retention_day") 30 | private int retentionDay; 31 | 32 | /** 33 | * 留存数量 34 | */ 35 | @Column(name = "retention_count") 36 | private int retentionCount; 37 | 38 | /** 39 | * 设备新增数量 40 | */ 41 | @Column(name = "new_mid_count") 42 | private int newMidCount; 43 | 44 | /** 45 | * 留存率 46 | */ 47 | @Column(name = "retention_ratio") 48 | private BigDecimal retentionRatio; 49 | } 50 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/entity/WastageCount.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.entity; 2 | 3 | import lombok.Data; 4 | 5 | import javax.persistence.Column; 6 | import javax.persistence.EmbeddedId; 7 | import javax.persistence.Entity; 8 | import javax.persistence.Table; 9 | 10 | /** 11 | * 流失用户数统计表 12 | */ 13 | @Data 14 | @Entity 15 | @Table(name = "ads_wastage_count") 16 | public class WastageCount { 17 | /** 18 | * 统计日期 19 | */ 20 | @EmbeddedId 21 | private DateTimePrimaryKey dateTime; 22 | 23 | /** 24 | * 流失设备数 25 | */ 26 | @Column(name = "wastage_count", nullable = false) 27 | private int wastageCount; 28 | } 29 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/mapping/BackCountMapping.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.mapping; 2 | 3 | import com.hadoop.web.entity.BackCount; 4 | import com.hadoop.web.model.BackCountModel; 5 | 6 | /** 7 | * 本周回流用户数统计表 8 | */ 9 | public class BackCountMapping { 10 | /** 11 | * Entity转换Model 12 | * 13 | * @param backCount 14 | * @return 15 | */ 16 | public static BackCountModel toModel(BackCount backCount) { 17 | if (backCount == null) { 18 | return null; 19 | } 20 | 21 | BackCountModel result = new BackCountModel(); 22 | result.setDateTime(backCount.getDateTime().getDateTime()); 23 | result.setWastageCount(backCount.getWastageCount()); 24 | return result; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/mapping/ContinuityUVCountMapping.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.mapping; 2 | 3 | import com.hadoop.web.entity.ContinuityUVCount; 4 | import com.hadoop.web.model.ContinuityUVCountModel; 5 | 6 | /** 7 | * 连续活跃设备数 8 | */ 9 | public class ContinuityUVCountMapping { 10 | /** 11 | * Entity转换Model 12 | * 13 | * @param continuityUVCount 14 | * @return 15 | */ 16 | public static ContinuityUVCountModel toModel(ContinuityUVCount continuityUVCount) { 17 | if (continuityUVCount == null) { 18 | return null; 19 | } 20 | 21 | ContinuityUVCountModel result = new ContinuityUVCountModel(); 22 | result.setDateTime(continuityUVCount.getDateTime().getDateTime()); 23 | result.setWeekDateTime(continuityUVCount.getWeekDateTime()); 24 | result.setContinuityCount(continuityUVCount.getContinuityCount()); 25 | 26 | return result; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/mapping/ContinuityWKCountMapping.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.mapping; 2 | 3 | import com.hadoop.web.entity.ContinuityWKCount; 4 | import com.hadoop.web.model.ContinuityWKCountModel; 5 | 6 | /** 7 | * 最近连续三周活跃用户数统计 8 | */ 9 | public class ContinuityWKCountMapping { 10 | /** 11 | * Entity转换Model 12 | * 13 | * @param continuityWKCount 14 | * @return 15 | */ 16 | public static ContinuityWKCountModel toModel(ContinuityWKCount continuityWKCount) { 17 | if (continuityWKCount == null) { 18 | return null; 19 | } 20 | 21 | ContinuityWKCountModel result = new ContinuityWKCountModel(); 22 | result.setDateTime(continuityWKCount.getDateTime().getDateTime()); 23 | result.setWeekDateTime(continuityWKCount.getWeekDateTime()); 24 | result.setContinuityCount(continuityWKCount.getContinuityCount()); 25 | 26 | return result; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/mapping/NewMIDCountMapping.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.mapping; 2 | 3 | import com.hadoop.web.entity.NewMIDCount; 4 | import com.hadoop.web.model.NewMIDCountModel; 5 | 6 | /** 7 | * 每日新增设备信息数量统计表 8 | */ 9 | public class NewMIDCountMapping { 10 | /** 11 | * Entity转换Model 12 | * 13 | * @param newMIDCount 14 | * @return 15 | */ 16 | public static NewMIDCountModel toModel(NewMIDCount newMIDCount) { 17 | if (newMIDCount == null) { 18 | return null; 19 | } 20 | 21 | NewMIDCountModel result = new NewMIDCountModel(); 22 | result.setCreateDate(newMIDCount.getCreateDate().getCreateDate()); 23 | result.setNewMidCount(newMIDCount.getNewMidCount()); 24 | return result; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/mapping/SilentCountMapping.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.mapping; 2 | 3 | import com.hadoop.web.entity.SilentCount; 4 | import com.hadoop.web.model.SilentCountModel; 5 | 6 | /** 7 | * 沉默用户数统计表 8 | */ 9 | public class SilentCountMapping { 10 | /** 11 | * Entity转换Model 12 | * 13 | * @param silentCount 14 | * @return 15 | */ 16 | public static SilentCountModel toModel(SilentCount silentCount) { 17 | if (silentCount == null) { 18 | return null; 19 | } 20 | 21 | SilentCountModel result = new SilentCountModel(); 22 | result.setDateTime(silentCount.getDateTime().getDateTime()); 23 | result.setSilentCount(silentCount.getSilentCount()); 24 | 25 | return result; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/mapping/UVCountMapping.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.mapping; 2 | 3 | import com.hadoop.web.entity.UVCount; 4 | import com.hadoop.web.model.UVCountModel; 5 | 6 | /** 7 | * 活跃设备数统计表 8 | */ 9 | public class UVCountMapping { 10 | /** 11 | * Entity转换Model 12 | * 13 | * @param uvCount 14 | * @return 15 | */ 16 | public static UVCountModel toModel(UVCount uvCount) { 17 | if (uvCount == null) { 18 | return null; 19 | } 20 | 21 | UVCountModel result = new UVCountModel(); 22 | result.setDateTime(uvCount.getDateTime().getDateTime()); 23 | result.setDayCount(uvCount.getDayCount()); 24 | result.setMnCount(uvCount.getMnCount()); 25 | result.setWkCount(uvCount.getWkCount()); 26 | result.setIsMonthend(uvCount.getIsMonthend()); 27 | result.setIsWeekend(uvCount.getIsWeekend()); 28 | 29 | return result; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/mapping/UserRetentionDayRateMapping.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.mapping; 2 | 3 | import com.hadoop.web.entity.UserRetentionDayRate; 4 | import com.hadoop.web.model.UserRetentionDayRateModel; 5 | 6 | /** 7 | * 每日用户留存情况统计表 8 | */ 9 | public class UserRetentionDayRateMapping { 10 | /** 11 | * Entity转换Model 12 | * 13 | * @param userRetentionDayRate 14 | * @return 15 | */ 16 | public static UserRetentionDayRateModel toModel(UserRetentionDayRate userRetentionDayRate) { 17 | if (userRetentionDayRate == null) { 18 | return null; 19 | } 20 | 21 | UserRetentionDayRateModel result = new UserRetentionDayRateModel(); 22 | result.setCreateDate(userRetentionDayRate.getDate().getCreateDate()); 23 | result.setDateTime(userRetentionDayRate.getDate().getDateTime()); 24 | result.setNewMidCount(userRetentionDayRate.getNewMidCount()); 25 | result.setRetentionCount(userRetentionDayRate.getRetentionCount()); 26 | result.setRetentionDay(userRetentionDayRate.getRetentionDay()); 27 | result.setRetentionRatio(userRetentionDayRate.getRetentionRatio()); 28 | 29 | return result; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/mapping/WastageCountMapping.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.mapping; 2 | 3 | import com.hadoop.web.entity.WastageCount; 4 | import com.hadoop.web.model.WastageCountModel; 5 | 6 | /** 7 | * 流失用户数统计表 8 | */ 9 | public class WastageCountMapping { 10 | /** 11 | * Entity转换Model 12 | * 13 | * @param wastageCount 14 | * @return 15 | */ 16 | public static WastageCountModel toModel(WastageCount wastageCount) { 17 | if (wastageCount == null) { 18 | return null; 19 | } 20 | WastageCountModel result = new WastageCountModel(); 21 | result.setDateTime(wastageCount.getDateTime().getDateTime()); 22 | result.setWastageCount(wastageCount.getWastageCount()); 23 | 24 | return result; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/model/BackCountModel.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.model; 2 | 3 | import io.swagger.annotations.ApiModel; 4 | import io.swagger.annotations.ApiModelProperty; 5 | import lombok.Data; 6 | 7 | /** 8 | * 本周回流用户数统计表 9 | */ 10 | @Data 11 | @ApiModel(value = "backCount", description = "本周回流用户数统计表") 12 | public class BackCountModel { 13 | /** 14 | * 统计日期 15 | */ 16 | @ApiModelProperty(value = "统计日期", name = "dateTime", example = "2020-10-10") 17 | private String dateTime; 18 | /** 19 | * 回流用户数 20 | */ 21 | @ApiModelProperty(value = "回流用户数", name = "wastageCount", example = "3") 22 | private int wastageCount; 23 | } 24 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/model/ContinuityUVCountModel.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.model; 2 | 3 | import io.swagger.annotations.ApiModel; 4 | import io.swagger.annotations.ApiModelProperty; 5 | import lombok.Data; 6 | 7 | /** 8 | * 连续活跃设备数 9 | */ 10 | @Data 11 | @ApiModel(value = "continuityUVCount", description = "连续活跃设备数") 12 | public class ContinuityUVCountModel { 13 | /** 14 | * 统计日期 15 | */ 16 | @ApiModelProperty(value = "统计日期", name = "dateTime", example = "2020-09-25") 17 | private String dateTime; 18 | /** 19 | * 最近 7 天日期 20 | */ 21 | @ApiModelProperty(value = "最近 7 天日期", name = "weekDateTime", example = "2020-09-19_2020-09-25") 22 | private String weekDateTime; 23 | /** 24 | * 连续活跃设备数 25 | */ 26 | @ApiModelProperty(value = "连续活跃设备数", name = "continuityCount", example = "1") 27 | private int continuityCount; 28 | } 29 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/model/ContinuityWKCountModel.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.model; 2 | 3 | import io.swagger.annotations.ApiModel; 4 | import io.swagger.annotations.ApiModelProperty; 5 | import lombok.Data; 6 | 7 | /** 8 | * 最近连续三周活跃用户数统计 9 | */ 10 | @Data 11 | @ApiModel(value = "continuityWKCount", description = "最近连续三周活跃用户数统计") 12 | public class ContinuityWKCountModel { 13 | /** 14 | * 统计日期 15 | */ 16 | @ApiModelProperty(value = "统计日期", name = "dateTime", example = "2020-09-25") 17 | private String dateTime; 18 | /** 19 | * 最近 7 天日期 20 | */ 21 | @ApiModelProperty(value = "最近 7 天日期", name = "weekDateTime", example = "2020-09-19_2020-09-25") 22 | private String weekDateTime; 23 | /** 24 | * 连续活跃设备数 25 | */ 26 | @ApiModelProperty(value = "连续活跃设备数", name = "continuityCount", example = "1") 27 | private int continuityCount; 28 | } 29 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/model/NewMIDCountModel.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.model; 2 | 3 | import io.swagger.annotations.ApiModel; 4 | import io.swagger.annotations.ApiModelProperty; 5 | import lombok.Data; 6 | 7 | /** 8 | * 每日新增设备信息数量统计表 9 | */ 10 | @Data 11 | @ApiModel(value = "newMIDCount", description = "每日新增设备信息数量统计表") 12 | public class NewMIDCountModel { 13 | /** 14 | * 统计日期 15 | */ 16 | @ApiModelProperty(value = "统计日期", name = "createDate", example = "2020-09-25") 17 | private String createDate; 18 | /** 19 | * 每日新增设备信息数量 20 | */ 21 | @ApiModelProperty(value = "每日新增设备信息数量", name = "newMidCount", example = "3") 22 | private int newMidCount; 23 | } 24 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/model/SilentCountModel.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.model; 2 | 3 | import io.swagger.annotations.ApiModel; 4 | import io.swagger.annotations.ApiModelProperty; 5 | import lombok.Data; 6 | 7 | /** 8 | * 沉默用户数统计表 9 | */ 10 | @Data 11 | @ApiModel(value = "silentCount", description = "沉默用户数统计表") 12 | public class SilentCountModel { 13 | /** 14 | * 统计日期 15 | */ 16 | @ApiModelProperty(value = "统计日期", name = "dateTime", example = "2020-09-30") 17 | private String dateTime; 18 | /** 19 | * 沉默设备数 20 | */ 21 | @ApiModelProperty(value = "沉默设备数", name = "silentCount", example = "1") 22 | private int silentCount; 23 | } 24 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/model/UVCountModel.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.model; 2 | 3 | import io.swagger.annotations.ApiModel; 4 | import io.swagger.annotations.ApiModelProperty; 5 | import lombok.Data; 6 | 7 | /** 8 | * 活跃设备数统计表 9 | */ 10 | @Data 11 | @ApiModel(value = "uvCount", description = "活跃设备数统计表") 12 | public class UVCountModel { 13 | /** 14 | * 统计日期 15 | */ 16 | @ApiModelProperty(value = "统计日期", name = "dateTime", example = "2020-09-30") 17 | private String dateTime; 18 | /** 19 | * 当日用户数量 20 | */ 21 | @ApiModelProperty(value = "当日用户数量", name = "dayCount", example = "5") 22 | private int dayCount; 23 | 24 | /** 25 | * 当周用户数量 26 | */ 27 | @ApiModelProperty(value = "当周用户数量", name = "wkCount", example = "12") 28 | private int wkCount; 29 | 30 | /** 31 | * 当月用户数量 32 | */ 33 | @ApiModelProperty(value = "当月用户数量", name = "mnCount", example = "23") 34 | private int mnCount; 35 | 36 | /** 37 | * Y,N 是否是周末,用于得到本周最终结果 38 | */ 39 | @ApiModelProperty(value = "Y,N 是否是周末,用于得到本周最终结果", name = "isWeekend", example = "Y") 40 | private String isWeekend; 41 | 42 | /** 43 | * Y,N 是否是月末,用于得到本月最终结果 44 | */ 45 | @ApiModelProperty(value = "Y,N 是否是月末,用于得到本月最终结果", name = "isMonthend", example = "Y") 46 | private String isMonthend; 47 | } 48 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/model/UserRetentionDayRateModel.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.model; 2 | 3 | 4 | import io.swagger.annotations.ApiModel; 5 | import io.swagger.annotations.ApiModelProperty; 6 | import lombok.Data; 7 | 8 | import java.math.BigDecimal; 9 | 10 | /** 11 | * 每日用户留存情况统计表 12 | */ 13 | @Data 14 | @ApiModel(value = "silentCount", description = "沉默用户数统计表") 15 | public class UserRetentionDayRateModel { 16 | /** 17 | * 统计日期 18 | */ 19 | @ApiModelProperty(value = "统计日期", name = "dateTime", example = "2020-09-30") 20 | private String dateTime; 21 | 22 | /** 23 | * 设备新增日期 24 | */ 25 | @ApiModelProperty(value = "设备新增日期", name = "createDate", example = "2020-09-30") 26 | private String createDate; 27 | 28 | /** 29 | * 截止当前日期留存天数 30 | */ 31 | @ApiModelProperty(value = "截止当前日期留存天数", name = "retentionDay", example = "1") 32 | private int retentionDay; 33 | 34 | /** 35 | * 留存数量 36 | */ 37 | @ApiModelProperty(value = "留存数量", name = "retentionCount", example = "1") 38 | private int retentionCount; 39 | 40 | /** 41 | * 设备新增数量 42 | */ 43 | @ApiModelProperty(value = "设备新增数量", name = "newMidCount", example = "1") 44 | private int newMidCount; 45 | 46 | /** 47 | * 留存率 48 | */ 49 | @ApiModelProperty(value = "留存率", name = "retentionRatio", example = "1.2") 50 | private BigDecimal retentionRatio; 51 | } 52 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/model/WastageCountModel.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.model; 2 | 3 | import io.swagger.annotations.ApiModel; 4 | import io.swagger.annotations.ApiModelProperty; 5 | import lombok.Data; 6 | 7 | /** 8 | * 流失用户数统计表 9 | */ 10 | @Data 11 | @ApiModel(value = "wastageCount", description = "流失用户数统计表") 12 | public class WastageCountModel { 13 | /** 14 | * 统计日期 15 | */ 16 | @ApiModelProperty(value = "统计日期", name = "dateTime", example = "2020-09-30") 17 | private String dateTime; 18 | /** 19 | * 流失设备数 20 | */ 21 | @ApiModelProperty(value = "流失设备数", name = "wastageCount", example = "5") 22 | private int wastageCount; 23 | } 24 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/repository/BackCountJPARepository.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.repository; 2 | 3 | import com.hadoop.web.entity.BackCount; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.stereotype.Repository; 6 | 7 | /** 8 | * 本周回流用户数统计 9 | */ 10 | @Repository 11 | public interface BackCountJPARepository extends JpaRepository { 12 | } 13 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/repository/ContinuityUVCountJPARepository.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.repository; 2 | 3 | import com.hadoop.web.entity.ContinuityUVCount; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.stereotype.Repository; 6 | 7 | /** 8 | * 连续活跃设备数 9 | */ 10 | @Repository 11 | public interface ContinuityUVCountJPARepository extends JpaRepository { 12 | } 13 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/repository/ContinuityWKCountJPARepository.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.repository; 2 | 3 | import com.hadoop.web.entity.ContinuityWKCount; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.stereotype.Repository; 6 | 7 | /** 8 | * 最近连续三周活跃用户数统计 9 | */ 10 | @Repository 11 | public interface ContinuityWKCountJPARepository extends JpaRepository { 12 | } 13 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/repository/JPARepository.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.repository; 2 | 3 | import com.querydsl.jpa.impl.JPAQueryFactory; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.stereotype.Repository; 6 | 7 | import javax.persistence.EntityManager; 8 | import javax.persistence.PersistenceContext; 9 | 10 | @Repository 11 | public class JPARepository { 12 | 13 | /** 14 | * 容器托管的EntityManager对象 15 | * 容器托管的EntityManager对象最为简单,编程人员不需要考虑EntityManger的连接, 16 | * 释放以及复杂的事务问题等等,所有这些都交给容器来完成。 17 | */ 18 | @PersistenceContext 19 | private EntityManager entityManager; 20 | 21 | @Bean 22 | public JPAQueryFactory jpaQueryFactory() { 23 | return new JPAQueryFactory(entityManager); 24 | } 25 | } -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/repository/NewMIDCountJPARepository.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.repository; 2 | 3 | import com.hadoop.web.entity.NewMIDCount; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.stereotype.Repository; 6 | 7 | /** 8 | * 每日新增设备信息数量统计表 9 | */ 10 | @Repository 11 | public interface NewMIDCountJPARepository extends JpaRepository { 12 | } 13 | 14 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/repository/SilentCountJPARepository.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.repository; 2 | 3 | import com.hadoop.web.entity.SilentCount; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.stereotype.Repository; 6 | 7 | /** 8 | * 沉默用户数统计表 9 | */ 10 | @Repository 11 | public interface SilentCountJPARepository extends JpaRepository { 12 | } 13 | 14 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/repository/UVCountJPARepository.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.repository; 2 | 3 | import com.hadoop.web.entity.UVCount; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.stereotype.Repository; 6 | 7 | /** 8 | * 活跃设备数统计表 9 | */ 10 | @Repository 11 | public interface UVCountJPARepository extends JpaRepository { 12 | } 13 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/repository/UserRetentionDayRateJPARepository.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.repository; 2 | 3 | import com.hadoop.web.entity.UserRetentionDayRate; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.stereotype.Repository; 6 | 7 | /** 8 | * 每日用户留存情况统计表 9 | */ 10 | @Repository 11 | public interface UserRetentionDayRateJPARepository extends JpaRepository { 12 | } 13 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/repository/WastageCountJPARepository.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.repository; 2 | 3 | import com.hadoop.web.entity.WastageCount; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.stereotype.Repository; 6 | 7 | /** 8 | * 流失用户数统计表 9 | */ 10 | @Repository 11 | public interface WastageCountJPARepository extends JpaRepository { 12 | } 13 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/service/BackCountService.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.service; 2 | 3 | import com.hadoop.web.model.BackCountModel; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * 本周回流用户数统计 9 | */ 10 | public interface BackCountService { 11 | List findAll(); 12 | } 13 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/service/ContinuityUVCountService.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.service; 2 | 3 | import com.hadoop.web.model.ContinuityUVCountModel; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * 连续活跃设备数 9 | */ 10 | public interface ContinuityUVCountService { 11 | List findAll(); 12 | } 13 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/service/ContinuityWKCountService.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.service; 2 | 3 | import com.hadoop.web.model.ContinuityWKCountModel; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * 最近连续三周活跃用户数统计 9 | */ 10 | public interface ContinuityWKCountService { 11 | List findAll(); 12 | } 13 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/service/NewMIDCountService.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.service; 2 | 3 | import com.hadoop.web.model.NewMIDCountModel; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * 每日新增设备信息数量统计表 9 | */ 10 | public interface NewMIDCountService { 11 | List findAll(); 12 | } 13 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/service/SilentCountService.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.service; 2 | 3 | import com.hadoop.web.model.SilentCountModel; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * 沉默用户数统计表 9 | */ 10 | public interface SilentCountService { 11 | List findAll(); 12 | } 13 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/service/UVCountService.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.service; 2 | 3 | import com.hadoop.web.model.UVCountModel; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * 活跃设备数统计表 9 | */ 10 | public interface UVCountService { 11 | List findAll(); 12 | } 13 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/service/UserRetentionDayRateService.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.service; 2 | 3 | import com.hadoop.web.model.UserRetentionDayRateModel; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * 每日用户留存情况统计表 9 | */ 10 | public interface UserRetentionDayRateService { 11 | List findAll(); 12 | } 13 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/service/WastageCountService.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.service; 2 | 3 | import com.hadoop.web.model.WastageCountModel; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * 流失用户数统计表 9 | */ 10 | public interface WastageCountService { 11 | List findAll(); 12 | } 13 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/service/impl/BackCountServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.service.impl; 2 | 3 | import com.hadoop.web.entity.BackCount; 4 | import com.hadoop.web.mapping.BackCountMapping; 5 | import com.hadoop.web.model.BackCountModel; 6 | import com.hadoop.web.repository.BackCountJPARepository; 7 | import com.hadoop.web.service.BackCountService; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | import java.util.ArrayList; 12 | import java.util.List; 13 | 14 | /** 15 | * 本周回流用户数统计 16 | */ 17 | @Service 18 | public class BackCountServiceImpl implements BackCountService { 19 | 20 | @Autowired 21 | private BackCountJPARepository jpaRepository; 22 | 23 | @Override 24 | public List findAll() { 25 | List backCounts = jpaRepository.findAll(); 26 | 27 | List results = new ArrayList<>(); 28 | backCounts.forEach(o -> results.add(BackCountMapping.toModel(o))); 29 | return results; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/service/impl/ContinuityUVCountServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.service.impl; 2 | 3 | import com.hadoop.web.entity.ContinuityUVCount; 4 | import com.hadoop.web.mapping.ContinuityUVCountMapping; 5 | import com.hadoop.web.model.ContinuityUVCountModel; 6 | import com.hadoop.web.repository.ContinuityUVCountJPARepository; 7 | import com.hadoop.web.service.ContinuityUVCountService; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | import java.util.ArrayList; 12 | import java.util.List; 13 | 14 | /** 15 | * 连续活跃设备数 16 | */ 17 | @Service 18 | public class ContinuityUVCountServiceImpl implements ContinuityUVCountService { 19 | 20 | @Autowired 21 | private ContinuityUVCountJPARepository jpaRepository; 22 | 23 | @Override 24 | public List findAll() { 25 | List continuityUVCounts = jpaRepository.findAll(); 26 | 27 | List results = new ArrayList<>(); 28 | continuityUVCounts.forEach(o -> results.add(ContinuityUVCountMapping.toModel(o))); 29 | return results; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/service/impl/ContinuityWKCountServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.service.impl; 2 | 3 | import com.hadoop.web.entity.ContinuityWKCount; 4 | import com.hadoop.web.mapping.ContinuityWKCountMapping; 5 | import com.hadoop.web.model.ContinuityWKCountModel; 6 | import com.hadoop.web.repository.ContinuityWKCountJPARepository; 7 | import com.hadoop.web.service.ContinuityWKCountService; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | import java.util.ArrayList; 12 | import java.util.List; 13 | 14 | /** 15 | * 最近连续三周活跃用户数统计 16 | */ 17 | @Service 18 | public class ContinuityWKCountServiceImpl implements ContinuityWKCountService { 19 | 20 | @Autowired 21 | private ContinuityWKCountJPARepository jpaRepository; 22 | 23 | @Override 24 | public List findAll() { 25 | 26 | List continuityWKCounts = jpaRepository.findAll(); 27 | 28 | List results = new ArrayList<>(); 29 | continuityWKCounts.forEach(o -> results.add(ContinuityWKCountMapping.toModel(o))); 30 | 31 | return results; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/service/impl/NewMIDCountServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.service.impl; 2 | 3 | import com.hadoop.web.entity.NewMIDCount; 4 | import com.hadoop.web.mapping.NewMIDCountMapping; 5 | import com.hadoop.web.model.NewMIDCountModel; 6 | import com.hadoop.web.repository.NewMIDCountJPARepository; 7 | import com.hadoop.web.service.NewMIDCountService; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | import java.util.ArrayList; 12 | import java.util.List; 13 | 14 | /** 15 | * 每日新增设备信息数量统计表 16 | */ 17 | @Service 18 | public class NewMIDCountServiceImpl implements NewMIDCountService { 19 | 20 | @Autowired 21 | private NewMIDCountJPARepository jpaRepository; 22 | 23 | @Override 24 | public List findAll() { 25 | List newMIDCounts = jpaRepository.findAll(); 26 | List results = new ArrayList<>(); 27 | 28 | newMIDCounts.forEach(o -> results.add(NewMIDCountMapping.toModel(o))); 29 | return results; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/service/impl/SilentCountServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.service.impl; 2 | 3 | import com.hadoop.web.entity.SilentCount; 4 | import com.hadoop.web.mapping.SilentCountMapping; 5 | import com.hadoop.web.model.SilentCountModel; 6 | import com.hadoop.web.repository.SilentCountJPARepository; 7 | import com.hadoop.web.service.SilentCountService; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | import java.util.ArrayList; 12 | import java.util.List; 13 | 14 | /** 15 | * 沉默用户数统计表 16 | */ 17 | @Service 18 | public class SilentCountServiceImpl implements SilentCountService { 19 | 20 | @Autowired 21 | private SilentCountJPARepository jpaRepository; 22 | 23 | @Override 24 | public List findAll() { 25 | List silentCounts = jpaRepository.findAll(); 26 | List results = new ArrayList<>(); 27 | silentCounts.forEach(o -> results.add(SilentCountMapping.toModel(o))); 28 | return results; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/service/impl/UVCountServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.service.impl; 2 | 3 | import com.hadoop.web.entity.UVCount; 4 | import com.hadoop.web.mapping.UVCountMapping; 5 | import com.hadoop.web.model.UVCountModel; 6 | import com.hadoop.web.repository.UVCountJPARepository; 7 | import com.hadoop.web.service.UVCountService; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | import java.util.ArrayList; 12 | import java.util.List; 13 | 14 | /** 15 | * 活跃设备数统计表 16 | */ 17 | @Service 18 | public class UVCountServiceImpl implements UVCountService { 19 | 20 | @Autowired 21 | private UVCountJPARepository jpaRepository; 22 | 23 | @Override 24 | public List findAll() { 25 | List uvCounts = jpaRepository.findAll(); 26 | List results = new ArrayList<>(); 27 | uvCounts.forEach(o -> results.add(UVCountMapping.toModel(o))); 28 | return results; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/service/impl/UserRetentionDayRateServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.service.impl; 2 | 3 | import com.hadoop.web.entity.UserRetentionDayRate; 4 | import com.hadoop.web.mapping.UserRetentionDayRateMapping; 5 | import com.hadoop.web.model.UserRetentionDayRateModel; 6 | import com.hadoop.web.repository.UserRetentionDayRateJPARepository; 7 | import com.hadoop.web.service.UserRetentionDayRateService; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | import java.util.ArrayList; 12 | import java.util.List; 13 | 14 | /** 15 | * 每日用户留存情况统计表 16 | */ 17 | @Service 18 | public class UserRetentionDayRateServiceImpl implements UserRetentionDayRateService { 19 | 20 | @Autowired 21 | private UserRetentionDayRateJPARepository jpaRepository; 22 | 23 | @Override 24 | public List findAll() { 25 | List userRetentionDayRates = jpaRepository.findAll(); 26 | List results = new ArrayList<>(); 27 | userRetentionDayRates.forEach(o -> results.add(UserRetentionDayRateMapping.toModel(o))); 28 | return results; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/java/com/hadoop/web/service/impl/WastageCountServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.hadoop.web.service.impl; 2 | 3 | import com.hadoop.web.entity.WastageCount; 4 | import com.hadoop.web.mapping.WastageCountMapping; 5 | import com.hadoop.web.model.WastageCountModel; 6 | import com.hadoop.web.repository.WastageCountJPARepository; 7 | import com.hadoop.web.service.WastageCountService; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | import java.util.ArrayList; 12 | import java.util.List; 13 | 14 | /** 15 | * 流失用户数统计表 16 | */ 17 | @Service 18 | public class WastageCountServiceImpl implements WastageCountService { 19 | 20 | @Autowired 21 | private WastageCountJPARepository jpaRepository; 22 | 23 | @Override 24 | public List findAll() { 25 | List wastageCounts = jpaRepository.findAll(); 26 | 27 | List results = new ArrayList<>(); 28 | wastageCounts.forEach(o -> results.add(WastageCountMapping.toModel(o))); 29 | 30 | return results; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /com-hadoop-web-demo/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | datasource: 3 | driver-class-name: com.mysql.cj.jdbc.Driver 4 | url: jdbc:mysql://172.12.0.3:3306/demo_database_gmall?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&createDatabaseIfNotExist=true&useSSL=true 5 | username: root 6 | password: root 7 | 8 | jpa: 9 | properties: 10 | hibernate: 11 | hbm2ddl: 12 | auto: update #update:最常用的属性值,第一次加载Hibernate时创建数据表(前提是需要先有数据库),以后加载HIbernate时只会根据model更新,即使model已经删除了某些属性,数据表也不会随之删除字段。 13 | dialect: org.hibernate.dialect.MySQL5InnoDBDialect 14 | format_sql: true 15 | show-sql: true 16 | database: mysql 17 | hibernate: 18 | ddl-auto: update -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | 8 | org.springframework.boot 9 | spring-boot-starter-parent 10 | 2.3.3.RELEASE 11 | 12 | 13 | org.example 14 | com-bigdata-hadoop-demo 15 | pom 16 | 1.0-SNAPSHOT 17 | 18 | 19 | 20 | org.springframework.boot 21 | spring-boot-starter-web 22 | 23 | 24 | org.apache.logging.log4j 25 | log4j-slf4j-impl 26 | 27 | 28 | 29 | 30 | 31 | 32 | com-hadoop-hbase-demo 33 | com-hadoop-hive-demo 34 | com-hadoop-elasticsearch-demo 35 | com-hadoop-web-demo 36 | com-hadoop-spark-demo 37 | com-hadoop-flink-demo 38 | com-hadoop-kafka-demo 39 | com-hadoop-hive-udf 40 | com-hadoop-azkaban-demo 41 | 42 | 43 | 44 | 45 | 46 | org.springframework.boot 47 | spring-boot-maven-plugin 48 | 49 | 50 | 51 | --------------------------------------------------------------------------------