1.环境搭建完成11

2.相关的工具类编写完成11
3.配置文件管理类编写完成11
zxr
劝酒千百 9 months ago
parent a33178593c
commit 735e337cac

@ -4,7 +4,7 @@
<option name="autoReloadType" value="ALL" /> <option name="autoReloadType" value="ALL" />
</component> </component>
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="a7505764-040b-48e2-b2fc-8c5b579e595f" name="Default" comment="1.环境搭建完成1&#10;2.相关的工具类编写完成1&#10;3.配置文件管理类编写完成1"> <list default="true" id="a7505764-040b-48e2-b2fc-8c5b579e595f" name="Default" comment="1.环境搭建完成11&#10;2.相关的工具类编写完成1&#10;3.配置文件管理类编写完成1">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/cn/edu/hust/session/UserVisitAnalyze.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/cn/edu/hust/session/UserVisitAnalyze.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/main/java/cn/edu/hust/session/UserVisitAnalyze.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/cn/edu/hust/session/UserVisitAnalyze.java" afterDir="false" />
</list> </list>
@ -477,7 +477,7 @@
<workItem from="1734349398416" duration="1738000" /> <workItem from="1734349398416" duration="1738000" />
<workItem from="1734352550638" duration="1153000" /> <workItem from="1734352550638" duration="1153000" />
<workItem from="1734354068325" duration="860000" /> <workItem from="1734354068325" duration="860000" />
<workItem from="1734354940766" duration="5212000" /> <workItem from="1734354940766" duration="7325000" />
</task> </task>
<task id="LOCAL-00001" summary="1.环境搭建完成&#10;2.相关的工具类编写完成&#10;3.配置文件管理类编写完成"> <task id="LOCAL-00001" summary="1.环境搭建完成&#10;2.相关的工具类编写完成&#10;3.配置文件管理类编写完成">
<created>1529592741848</created> <created>1529592741848</created>
@ -565,7 +565,15 @@
<option name="project" value="LOCAL" /> <option name="project" value="LOCAL" />
<updated>1734358371283</updated> <updated>1734358371283</updated>
</task> </task>
<option name="localTasksCounter" value="12" /> <task id="LOCAL-00012" summary="1.环境搭建完成11&#10;2.相关的工具类编写完成1&#10;3.配置文件管理类编写完成1">
<option name="closed" value="true" />
<created>1734360173676</created>
<option name="number" value="00012" />
<option name="presentableId" value="LOCAL-00012" />
<option name="project" value="LOCAL" />
<updated>1734360173676</updated>
</task>
<option name="localTasksCounter" value="13" />
<servers /> <servers />
</component> </component>
<component name="TestHistory"> <component name="TestHistory">
@ -689,7 +697,8 @@
<MESSAGE value="1.环境搭建完成&#10;2.相关的工具类编写完成11&#10;3.配置文件管理类编写完成11" /> <MESSAGE value="1.环境搭建完成&#10;2.相关的工具类编写完成11&#10;3.配置文件管理类编写完成11" />
<MESSAGE value="1.环境搭建完成11&#10;2.相关的工具类编写完成11&#10;3.配置文件管理类编写完成11" /> <MESSAGE value="1.环境搭建完成11&#10;2.相关的工具类编写完成11&#10;3.配置文件管理类编写完成11" />
<MESSAGE value="1.环境搭建完成1&#10;2.相关的工具类编写完成1&#10;3.配置文件管理类编写完成1" /> <MESSAGE value="1.环境搭建完成1&#10;2.相关的工具类编写完成1&#10;3.配置文件管理类编写完成1" />
<option name="LAST_COMMIT_MESSAGE" value="1.环境搭建完成1&#10;2.相关的工具类编写完成1&#10;3.配置文件管理类编写完成1" /> <MESSAGE value="1.环境搭建完成11&#10;2.相关的工具类编写完成1&#10;3.配置文件管理类编写完成1" />
<option name="LAST_COMMIT_MESSAGE" value="1.环境搭建完成11&#10;2.相关的工具类编写完成1&#10;3.配置文件管理类编写完成1" />
</component> </component>
<component name="editorHistoryManager"> <component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/src/main/java/cn/edu/hust/conf/ConfigurationManager.java"> <entry file="file://$PROJECT_DIR$/src/main/java/cn/edu/hust/conf/ConfigurationManager.java">

@ -441,6 +441,10 @@ public class UserVisitAnalyze {
JavaPairRDD<Long,String> sessionPartInfo=sessionActionGrouped.mapToPair(new PairFunction<Tuple2<String, Iterable<Row>>, Long, String>() { JavaPairRDD<Long,String> sessionPartInfo=sessionActionGrouped.mapToPair(new PairFunction<Tuple2<String, Iterable<Row>>, Long, String>() {
@Override @Override
public Tuple2<Long, String> call(Tuple2<String, Iterable<Row>> stringIterableTuple2) throws Exception { public Tuple2<Long, String> call(Tuple2<String, Iterable<Row>> stringIterableTuple2) throws Exception {
//提取关键信息:
//从 Iterable<Row> 中提取 sessionId 和 rows。
//初始化一些变量用于存储搜索关键字、点击类别ID、用户ID、开始时间、结束时间和步骤长度。
String sessionId=stringIterableTuple2._1; String sessionId=stringIterableTuple2._1;
Iterable<Row> rows=stringIterableTuple2._2; Iterable<Row> rows=stringIterableTuple2._2;
StringBuffer searchKeywords=new StringBuffer(); StringBuffer searchKeywords=new StringBuffer();
@ -449,19 +453,27 @@ public class UserVisitAnalyze {
Date startTime=null; Date startTime=null;
Date endTime=null; Date endTime=null;
int stepLength=0; int stepLength=0;
//遍历每一行 Row 对象:
//遍历每个 Row 对象,如果 userId 为空,则将其设置为当前的 userId。
//提取 searchKeyword 和 clickCategoryId。
for (Row row:rows) for (Row row:rows)
{ {
if(userId==null) if(userId==null)
userId=row.getLong(1); userId=row.getLong(1);
String searchKeyword=row.getString(5); String searchKeyword=row.getString(5);
Long clickCategoryId=row.getLong(6); Long clickCategoryId=row.getLong(6);
//判断是否需要拼接 //判断是否需要拼接
//拼接搜索关键字和点击类别ID
//检查 searchKeyword 是否为空并拼接到 searchKeywords 中。
if(StringUtils.isNotEmpty(searchKeyword)) if(StringUtils.isNotEmpty(searchKeyword))
{ {
if(!searchKeywords.toString().contains(searchKeyword)) if(!searchKeywords.toString().contains(searchKeyword))
searchKeywords.append(searchKeyword+","); searchKeywords.append(searchKeyword+",");
} }
//检查 clickCategoryId 是否为 null 并拼接到 clickCategoryIds 中。
if(clickCategoryId!=null) if(clickCategoryId!=null)
{ {
if(!clickCategoryId.toString().contains(String.valueOf(clickCategoryId))) if(!clickCategoryId.toString().contains(String.valueOf(clickCategoryId)))
@ -469,6 +481,9 @@ public class UserVisitAnalyze {
} }
//计算session开始时间和结束时间 //计算session开始时间和结束时间
//从 Row 对象中提取 actionTime。
//更新 startTime 和 endTime确保它们分别为最小和最大时间。
//增加 stepLength 记录步骤数。
Date actionTime= DateUtils.parseTime(row.getString(4)); Date actionTime= DateUtils.parseTime(row.getString(4));
if(startTime==null) if(startTime==null)
startTime=actionTime; startTime=actionTime;
@ -484,9 +499,13 @@ public class UserVisitAnalyze {
} }
stepLength++; stepLength++;
} }
//访问时长(s)
//计算访问时长:
//计算访问时长(以秒为单位)。
Long visitLengtth=(endTime.getTime()-startTime.getTime())/1000; Long visitLengtth=(endTime.getTime()-startTime.getTime())/1000;
//格式化信息并返回:
String searchKeywordsInfo=StringUtils.trimComma(searchKeywords.toString()); String searchKeywordsInfo=StringUtils.trimComma(searchKeywords.toString());
String clickCategoryIdsInfo=StringUtils.trimComma(clickCategoryIds.toString()); String clickCategoryIdsInfo=StringUtils.trimComma(clickCategoryIds.toString());
String info=Constants.FIELD_SESSIONID+"="+sessionId+"|"+Constants.FIELD_SERACH_KEYWORDS+"="+searchKeywordsInfo+"|" String info=Constants.FIELD_SESSIONID+"="+sessionId+"|"+Constants.FIELD_SERACH_KEYWORDS+"="+searchKeywordsInfo+"|"
@ -498,40 +517,96 @@ public class UserVisitAnalyze {
//查询所有的用户数据 //查询所有的用户数据
String sql="select * from user_info"; String sql="select * from user_info";
//执行SQL查询获取用户信息并将结果转换为 JavaRDD<Row>。
JavaRDD<Row> userInfoRDD=sc.sql(sql).javaRDD(); JavaRDD<Row> userInfoRDD=sc.sql(sql).javaRDD();
//将用户信息映射成map //将用户信息映射成map
//使用 mapToPair 方法将 JavaRDD<Row> 转换为 JavaPairRDD<Long, Row>
// 其中键为 Row 对象中的某个列(通常是 userId值为整个 Row 对象。
JavaPairRDD<Long,Row> userInfoPariRDD=userInfoRDD.mapToPair(new PairFunction<Row, Long, Row>() { JavaPairRDD<Long,Row> userInfoPariRDD=userInfoRDD.mapToPair(new PairFunction<Row, Long, Row>() {
@Override @Override
public Tuple2<Long, Row> call(Row row) throws Exception { public Tuple2<Long, Row> call(Row row) throws Exception {
return new Tuple2<Long, Row>(row.getLong(0),row); return new Tuple2<Long, Row>(row.getLong(0),row);
} }
}); });
//将两个信息join在一起 //将两个信息join在一起
//使用 join 方法将两个 JavaPairRDD 进行连接,连接键为 userId。结果是一个 JavaPairRDD<Long, Tuple2<String, Row>>
// 其中键为 userId值为一个包含用户会话信息和用户信息的元组。
JavaPairRDD<Long,Tuple2<String,Row>> tuple2JavaPairRDD=sessionPartInfo.join(userInfoPariRDD); JavaPairRDD<Long,Tuple2<String,Row>> tuple2JavaPairRDD=sessionPartInfo.join(userInfoPariRDD);
/**
* aggregateBySessionId sessionId ID访
*
* JavaPairRDD<Long, Row>
*
*
*/
/** /**
* session * session
*/ */
//定义 JavaPairRDD<String, String> 变量 sessionInfo
//定义一个名为 sessionInfo 的 JavaPairRDD<String, String>
// 并使用 mapToPair 方法对 tuple2JavaPairRDD 进行映射操作。
JavaPairRDD<String,String> sessionInfo=tuple2JavaPairRDD.mapToPair(new PairFunction<Tuple2<Long,Tuple2<String,Row>>, String, String>() { JavaPairRDD<String,String> sessionInfo=tuple2JavaPairRDD.mapToPair(new PairFunction<Tuple2<Long,Tuple2<String,Row>>, String, String>() {
@Override @Override
public Tuple2<String, String> call(Tuple2<Long, Tuple2<String, Row>> longTuple2Tuple2) throws Exception { public Tuple2<String, String> call(Tuple2<Long, Tuple2<String, Row>> longTuple2Tuple2) throws Exception {
//提取会话信息和用户信息:
//从 Tuple2<Long, Tuple2<String, Row>> 中提取 sessionPartInfo 和 userInfo。
//sessionPartInfo 是会话的详细信息userInfo 是用户的详细信息。
String sessionPartInfo=longTuple2Tuple2._2._1; String sessionPartInfo=longTuple2Tuple2._2._1;
Row userInfo=longTuple2Tuple2._2._2; Row userInfo=longTuple2Tuple2._2._2;
//拿到需要的用户信息 //拿到需要的用户信息
//从 Row 对象 userInfo 中提取用户的基本信息,
// 包括年龄 age、职业 professional、城市 city 和性别 sex。
int age=userInfo.getInt(3); int age=userInfo.getInt(3);
String professional=userInfo.getString(4); String professional=userInfo.getString(4);
String city=userInfo.getString(5); String city=userInfo.getString(5);
String sex=userInfo.getString(6); String sex=userInfo.getString(6);
//拼接字符串 //拼接字符串
//将会话信息 sessionPartInfo 和用户信息拼接成一个完整的字符串 fullInfo。
String fullInfo=sessionPartInfo+"|"+Constants.FIELD_AGE+"="+age+"|" String fullInfo=sessionPartInfo+"|"+Constants.FIELD_AGE+"="+age+"|"
+Constants.FIELD_PROFESSIONAL+"="+professional+"|"+Constants.FIELD_CITY+"="+city+"|"+Constants.FIELD_SEX+"="+sex; +Constants.FIELD_PROFESSIONAL+"="+professional+"|"+Constants.FIELD_CITY+"="+city+"|"+Constants.FIELD_SEX+"="+sex;
//提取会话ID
//使用 StringUtils.getFieldFromConcatString 方法从 sessionPartInfo 中提取会话ID
// 假设会话ID的格式是 Constants.FIELD_SESSIONID。
String session=StringUtils.getFieldFromConcatString(sessionPartInfo,"\\|",Constants.FIELD_SESSIONID); String session=StringUtils.getFieldFromConcatString(sessionPartInfo,"\\|",Constants.FIELD_SESSIONID);
//返回结果:
//返回一个 Tuple2<String, String>
// 其中键为会话ID session值为包含会话信息和用户信息的字符串 fullInfo。
return new Tuple2<String, String>(session,fullInfo); return new Tuple2<String, String>(session,fullInfo);
} }
}); });
//返回处理后的 sessionInfo。
return sessionInfo; return sessionInfo;
} }
/**
*
* tuple2JavaPairRDD JavaPairRDD<String, String>
*
* tuple2JavaPairRDD
* Row
*
* IDID
* ID JavaPairRDD
*
*/
/** /**

Loading…
Cancel
Save