Spark重点难点知识总结(二)

1.join:join函数主要用来拼接字符串,将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串。

var rdd1 = sc.makeRDD(Array(("A","1"),("B","2"),("C","3")),2)
var rdd2 = sc.makeRDD(Array(("A","a"),("C","c"),("D","d")),2)
scala> rdd1.join(rdd2).collect
res: Array[(String, (String, String))] = Array((A,(1,a)), (C,(3,c)))



2.countByKey:统计每个key对应的value个数。

val scores=Array(Tuple2(1,100),Tuple2(2,90),Tuple2(3,100),Tuple2(2,90),Tuple2(3,100))
val content=sc.parallelize(scores)
val data=content.countByKey()
res:data: scala.collection.Map[Int,Long] = Map(1 -> 1, 3 -> 2, 2 -> 2)


3.宽依赖和窄依赖:窄依赖是指每个父RDD的一个partition最多被子RDD的一个partition所使用,例如map,filter,union等都会产生窄依赖。窄依赖,1对1,n对1。宽依赖是指一个父RDD的Partition会被多个子RDD的Partition所使用,例如groupByKey、ReduceByKey、sortByKey等操作都会产生宽依赖。总结:如果父RDD的一个Partition被一个子RDD的Partition所使用就是窄依赖,否则的话就是宽依赖。



4.DataFrame与RDD:DataFrame是一种分布式二维数据结构,R和Python语言中都有DataFrame,Spark中的DataFrame最大的不同点是其天生是分布式的,可以简单的认为Spark中的DataFrame是一个分布式的Table,形式如下所示。


而RDD类型为

简单来说,RDD是一个个Person实例,RDD并不知道里面有什么类型的数据。

(1)RDD以Record为单位,Spark在优化的时候无法洞悉Record内部的细节,所以也就无法进行更深度的优化,这极大的限制了Spark SQL性能的提示。
(2)DataFrame包含了每个Record的Metadata信息,也就是说DataFrame的优化是基于列内部的优化,而不是像RDD一样,只能够基于行进行优化。


5.RDD转DataFrame

import java.util.List;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.sql.DataFrame;
import org.apache.spark.sql.SQLContext;
import org.apache.spark.sql.Row;
/*
 * 使用反射的方式将RDD转化为DataFrame*/
public class RDD2DataFrame {
    public static void main(String[] args) {
	SparkConf conf=new SparkConf().setAppName("RDD2DataFrame").setMaster("local");
	JavaSparkContext sc=new JavaSparkContext(conf);
	SQLContext sqlContext=new SQLContext(sc);
	JavaRDD<String> lines=sc.textFile("C://Users//Jason Shu//Desktop//persons.txt");
        JavaRDD<Person> persons=lines.map(new Function<String, Person>()
             {
                   public Person call(String line) throws Exception {
			String[] splited=line.split(",");
			Person p =new Person();
			p.setId(Integer.valueOf(splited[0].trim()));
			p.setName(splited[1]);
			p.setAge(Integer.valueOf(splited[0].trim()));
			return p;
		}
	});
        DataFrame df= sqlContext.createDataFrame(persons, Person.class);
        df.registerTempTable("persons");//注册一张临时表
        DataFrame bigData=sqlContext.sql("select * from persons where age >=6");
        JavaRDD<Row> bigDataRDD=bigData.javaRDD();
        JavaRDD<Person> result=bigDataRDD.map(new Function<Row, Person>() {
	   public Person call(Row row) throws Exception {
		Person p =new Person();
		p.setId(row.getInt(0));
		p.setName(row.getString(1));
		p.setAge(row.getInt(2));
		return p;
	    }
           });
       List<Person> personList=result.collect();
       for(Person p:personList){
	   System.out.println(p);
         }   
       }
      }


    转换过程示意图



6.Spark SQL和DataFrame:Spark SQL 是 Spark 生态系统里用于处理结构化大数据的模块,该模块里最重要的概念就是DataFrame, Spark 的 DataFrame 是基于早期版本中的 SchemaRDD,所以很自然的使用分布式大数据处理的场景。DataFrame 以 RDD 为基础,但是带有 Schema 信息,它类似于传统数据库中的二维表格。Spark SQL 模块目前支持将多种外部数据源的数据转化为 DataFrame,并像操作 RDD 或者将其注册为临时表的方式处理和分析这些数据。当前支持的数据源有:Json,文本文件,RDD,关系数据库,Hive,Parquet。一旦将 DataFrame 注册成临时表,我们就可以使用类 SQL 的方式操作这些数据。Spark SQL的表数据在内存中存储不是采用原生态的JVM对象存储方式,而是采用内存列存储,如下图所示。




7.Schema的方式创建DataFrame

import org.apache.spark.sql.types._
import org.apache.spark.sql.{Row, SQLContext}
import org.apache.spark.{SparkContext, SparkConf}

object schemaDataFrame {
  def main(args:Array[String]): Unit ={
    val conf=new SparkConf()
    conf.setMaster("local").setAppName("schemaDataFrame ")
    val sc=new SparkContext(conf)
    val RowRDD =sc.textFile("C://Users//Jason Shu//Desktop//InputFile.txt").map(x=>x.split(" ")).map(p=>Row(p(0),p(1)))
    val sqlContext=new SQLContext(sc)
    val peopleSchema=StructType(Array(
      StructField("name", StringType, true),
      StructField("age", IntegerType, true),
      StructField("sex", BooleanType, true)
            ))
    val peopleDataFrame = sqlContext.createDataFrame(RowRDD, peopleSchema)//创建DataFrame,第一个参数为Row[RDD],第二个参数为StructType
    peopleDataFrame.registerTempTable("people")//表的名字随便取一个
    val results = sqlContext.sql("SELECT name FROM people")
    results.map(t => "name: " + t(0)).collect().foreach(println)
  }
}


8.first():Return the first element in this RDD,first返回RDD中的第一个元素,不排序。

scala> var rdd1 = sc.makeRDD(Array(("A","1"),("B","2"),("C","3")),2)
rdd1: org.apache.spark.rdd.RDD[(String, String)] = ParallelCollectionRDD[33] at makeRDD at :21
 
scala> rdd1.first
res14: (String, String) = (A,1)
 
scala> var rdd1 = sc.makeRDD(Seq(10, 4, 2, 12, 3))
rdd1: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at makeRDD at :21
 
scala> rdd1.first
res8: Int = 10

9.contains():Returns true if and only if this string contains the specified sequence of char values,当且仅当此字符串包含指定的char值序列返回true


10.parallellize():在一个已经存在的Scala集合上创建的RDD, 集合的对象将会被拷贝,创建出一个可以被并行操作的分布式数据集。

val data = List(1, 2, 3, 4, 5)  

val distData = sc.parallelize(data)//distData此时为RDD[Int]


11.socketTextStream():相当于Socket客户端,里面的参数就是socket服务器的ip和端口,执行该语句的时候就向socket服务器发送了建立请求了。服务器端接受到了请求就可以给socketTextStream发送消息了


12.filter():使用filter方法,你可以筛选出集合中你需要的元素,形成一个新的集合。

val x = List.range(1, 10)
     
val evens = x.filterNot(_ % 2 == 0)

Res:evens: List[Int] = List(1, 3, 5, 7, 9)

13.String.valueOf():要把参数中给的值,转化为String类型,这里的参数是Any,任意的参数都可以。


14.Integer.parseInt:将整数的字符串,转化为整数。

val b="123"
  
val a=Integer.parseInt(b)
  
println(a)//打印结果123

15.collect():将RDD转成Scala数组,并返回。


16.Spark中的partition:提供一种划分数据的依据。例如wordcount程序中的:

val lines=sc.textFile(path, 8)
这个地方的8就是指8个分区,当然如果数据量不够或不够复杂,可以不分为8个。

<think>好的,我现在需要处理用户关于知识图谱实战案例和教程的请求。首先,用户明确提到想寻找实际应用案例或教程,特别是包含示例和项目实现的资源。根据用户提供的引用内容,我需要整合这些信息,确保回答结构清晰,并生成相关问题。 首先,检查用户提供的引用。引用[1]提到了冲突检测和解决机制,这可能涉及知识融合的技术,但用户需要的是应用案例,这部分可能不太相关。引用[2]和引用[4]都提到了具体的实战案例,比如Neo4j的入门示例和红楼梦人物知识图谱的构建,这些应该是重点。引用[3]提到金融、医疗等领域的应用,可以列举这些行业的案例。引用[4]中的开发环境搭建可能对用户有帮助,但需要结合实战案例说明。 接下来,我需要组织回答结构。用户希望有教程和项目实现,所以分点列出教程资源和实战案例。每个部分需要包括项目名称、技术工具、核心内容和参考链接。例如,引用[2]的Neo4j示例和引用[4]的红楼梦项目都是很好的教程案例。同时,引用[3]中的行业应用可以作为实际应用案例来介绍。 然后,生成相关问题。用户的问题通常可能涉及学习路径、工具推荐、数据处理方法以及行业应用,因此需要设计相关问题,比如如何入门、推荐工具、处理非结构化数据的方法、金融领域的应用等。 需要注意,所有数学表达式要用$...$格式,但用户的问题主要涉及知识图谱,可能不涉及太多数学内容,但如果有的话需要正确使用。例如,在讲解算法时如果有公式,要正确应用LaTeX语法。不过当前问题可能不涉及数学公式,所以重点放在结构化和引用上。 最后,确保回答中的引用标识自然添加,例如在提到某个案例时在句末加上[^2]、[^3]等。同时,检查是否有遗漏的信息,比如是否有其他引用内容可以补充,但根据用户提供的引用,已经涵盖了教程和案例,所以应该足够。 总结回答结构:分为教程推荐和实战案例,每个部分列出具体项目,最后生成相关问题。确保引用正确,结构清晰,符合用户要求。</think>### 知识图谱实战案例与教程推荐 #### 一、教程资源与项目实现 1. **Neo4j入门与基础示例** - **技术工具**: Neo4j图数据库 - **核心内容**: - 创建节点和关系:例如创建`Person`和`Movie`节点,并建立`ACTED_IN`关系,属性以键值对存储(如`{name: "Tom Hanks"}`)。 - 使用Cypher查询语言实现图遍历和关系分析。 - **参考实现**: ```cypher CREATE (:Person {name: "Alice"})-[:ACTED_IN]->(:Movie {title: "Matrix"}) ``` 通过类似代码可构建小型知识图谱并实现基础查询。 2. **红楼梦人物知识图谱构建** - **技术工具**: Python + Neo4j + 自然语言处理(NLP) - **核心内容**: - 从文本中抽取人物、地点、事件等实体。 - 构建实体间关系(如亲属、敌对、合作)。 - **实战难点**: 非结构化文本的实体消歧与关系抽取,需结合规则或深度学习模型[^4]。 3. **金融与法律领域知识图谱** - **应用场景**: - 金融领域:企业风险关联分析、反欺诈。 - 法律领域:案例判决辅助、法条关联推理。 - **技术方案**: 使用图算法(如社区发现、最短路径)支持复杂查询和推理。 --- #### 、实际应用案例 1. **医疗知识图谱** - **功能**: 疾病-症状-药品关联查询、诊断辅助。 - **实现方法**: 整合医学文献和临床数据,构建多源异构数据的融合图谱。 2. **旅游推荐系统** - **功能**: 基于用户偏好和景点属性的个性化推荐。 - **技术细节**: 使用图嵌入(Graph Embedding)表示节点,通过相似度计算生成推荐。 3. **企业风险防控** - **案例**: 通过股权穿透、高管关联等关系挖掘潜在风险链。 - **工具**: 结合Neo4j和Spark进行大规模图计算[^3]。 --- #### 三、开发工具与学习路径 1. **工具链推荐** - **图数据库**: Neo4j(适合中小规模)、JanusGraph(分布式)。 - **NLP工具**: spaCy(实体抽取)、Stanford CoreNLP(关系提取)。 - **可视化**: Gephi、D3.js。 2. **学习路径建议** - 入门:掌握Neo4j和Cypher语法。 - 进阶:学习实体对齐、知识推理算法(如路径推理、规则引擎)。 - 实战:从单领域图谱(如电影、图书)扩展到多源数据融合[^4]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值