이해 스파크 SQL (2 개) -는 SqlContext 및 HiveContext

사용 스파크 SQL, 사실, 이전에 기술 된 방법을 사용하여뿐만 아니라, 그것은 또한는 SqlContext 사용되거나 HiveContext 프로그래밍 구현했습니다. 이전의 지원과 HiveSQL 파서 파서 HiveSQL 기본적 구성 SQL 구문 분석기에 의해 전환 할 수있다, 사용자가 지원되지 않는 구 HiveQL을 실행하는 SQL 구문 분석기를 지원 SQL 파서 (SQL-92 구문) , 같은 : 1을 선택합니다. HiveContext 실제로 그렇게 무시 함수 및 변수 외에는 SqlContext의 서브 클래스 및 작동시는 SqlContext HiveContext 함수와 변수를 사용할 수있다.

스칼라 프로그램 조각 스파크 쉘 도구가 실제로 실행되기 때문에, 편의를 위해, 다음과 같은 데모 스파크 쉘을 사용.

표준 SQL은 첫째보기는 SqlContext는, 당신은 다음의 예 (하이브 메타 스토어를 시작하지 않음)로, 하이브 메타 스토어에 의존 할 수 없습니다 :

[루트 @ BruceCentOS4 ~] # $ SPARK_HOME / 빈 / 스파크 쉘 --master 실 --conf spark.sql.catalogImplementation = 메모리

 

 스칼라>의 경우 클래스 사무소 (더블 사무실 : INT, 도시 : 문자열, 지역 : 문자열, MGR : INT, 대상 : 더블, 판매)
클래스 사무실이 정의

스칼라> 발 rddOffices = sc.textFile ( "/ 사용자 / 하이브 / 창고 / orderdb.db / 사무실 / offices.txt "). (_. 스플릿 (MAP"p => 사무실 (p (0) .trim.toInt, P (1) (. \ t ")에) 매핑, P (2) P (3) .trim.toInt P (4) .trim.toDouble, P (5) .trim.toDouble))
rddOffices : org.apache.spark.rdd.RDD [사무실] = MapPartitionsRDD [3]에서 맵 26 <콘솔>에서

스칼라> 브로 officesDataFrame = spark.createDataFrame (rddOffices)
officesDataFrame : org.apache.spark.sql.DataFrame = 사무실 : INT : 시티 스트링 ... 4 개 이상의 필드]

스칼라> officesDataFrame.createOrReplaceTempView ( "사무실")

스칼라> spark.sql ( "사무실에서 선택 도시 어디 지역 = '동부'").지도 (t => "도시 :"+ t (0)). collect.foreach (에 println)
도시 : 뉴욕                                                                   
도시 : 시카고
도시 : 애틀랜타

스칼라>

 위의 명령을 실행 한 후, 사실, 클러스터에 원사의 원사 클라이언트 모드 스파크 응용 프로그램을 시작, 다음 스칼라> 프롬프트 RDD의 변환을 생성 될 문을 입력, 행동의 수집 RDD를 생성합니다 마지막 명령, 즉, 프로그램의 실행을 트리거하고 작업을 제출합니다.

그 이유 왜 명령 행 플러스 --conf spark.sql.catalogImplementation = 메모리 옵션 SparkSession의 시작의 기본 스파크 쉘 스파크가 활성화되어 기본 하이브 지원,이 옵션을 사용하지 않고있다 객체 있기 때문에, 프로그램 의지 하이브 메타 스토어가 시작되지 않았기 때문에 연결 하이브 메타 스토어에, 그래서 프로그램은 createDataFrame 오류의 구현에 작동합니다.

프로그램의 첫 번째 라인은 케이스 클래스 성명,이 배면 패턴 데이터 정의 파일 (이 방법에 부가하여 정의 모드 사실이 다른 방법으로하고 후술). 두 번째 줄은 HDFS에서 텍스트 파일에서 읽고, 위의 모드 맵을 통해 작업에 매핑됩니다. 셋째 행은 SQL 명령문 SparkSession SQL 함수에 의해 수행 될 수있는 논리 마지막 행에서 세 번째 행 DataFrame 임시 등록 테이블에서 네 번째 행에 기초하여, 두 번째 행 DataFrame RDD에 기초하여 생성된다.

실제로는 SqlContext는 SQL 입구 스파크 1.x에서이 SQL 입구로 SparkSession를 사용하여 스파크 2.X에서,하지만, 이전 버전과의 호환성을 위해, 스파크 2.x에서 여전히 작동하는 SQL는 SqlContext을 지원하지만 사용되지하라는 메시지가 표시됩니다이다 따라서, 위의 예는 스파크 2.X 문구의 사용이다.

실제로 예를 들어, 동일한 데이터에 대한 SQL을 조작하는 또 다른 방법이있다 :

스칼라> 수입 org.apache.spark.sql._
수입 org.apache.spark.sql._

스칼라> 수입 org.apache.spark.sql.types._의
수입 org.apache.spark.sql.types._

스칼라> 발 스키마 = 새로운 StructType (배열 (StructField ( "사무실", IntegerType, 거짓), StructField ( "도시", StringType, 거짓), StructField ( "지역", StringType, 거짓), StructField ( "MGR", IntegerType 사실 )) 사실 StructField ( "대상", DoubleType, StructField ( "판매", DoubleType, 거짓)))
스키마 : org.apache.spark.sql.types.StructType = StructType (StructField (사무실, IntegerType, 거짓) StructField (도시, StringType, 거짓), StructField (MGR, IntegerType, TRUE) StructField (지역, StringType, 거짓), StructField (대상, DoubleType, TRUE), StructField (판매, DoubleType, 거짓))

스칼라> 발 rowRDD = sc.textFile ( "/ 사용자 / 하이브 / 창고 / orderdb.db / 사무실 / offices.txt").지도 (_. 스플릿 ( "\ t")).지도 (p => 행 (p (0) .trim.toInt, P (1) P (2) P (3) .trim.toInt P (4) .trim.toDouble, P (5) .trim.toDouble))
rowRDD : 조직도. 에서지도를 apache.spark.rdd.RDD [org.apache.spark.sql.Row = MapPartitionsRDD [3] <콘솔> 30

스칼라> 브로 dataFrame = spark.createDataFrame (rowRDD, 스키마)
dataFrame : org.apache. spark.sql.DataFrame = [사무실 : INT, 도시 : 문자열 ... 4 개 분야]

스칼라> dataFrame.createOrReplaceTempView ( "사무실")

스칼라> spark.sql ( "사무실에서 선택 도시 어디 지역 = '동부'") .MAP (t => "도시"+ t (0)). collect.foreach (에 println)
도시 :                                                                   뉴욕
도시 : 시카고
도시 : 애틀랜타

이 예제와 앞의 예는 조금 다른, 세 가지 주요 영역이 있습니다 :

이전 사용의 경우 클래스 1의 예 모드 스키마를 추론하는 스파크 반사를 정의하고, 상기 객체 모델을 이용하여이 예에서는, 필드의 정의를 나타내는 배열 구성원 StructField 객체 각각으로 수신 StructType 유형을 정의 할 필드 명에 의해 정의 된 필드, 필드 타입, 및 널 조성물을 허용할지 여부;

데이터 RDD 나타내는 2., 필드 타입으로 나누어 정의 바로 이전 예 케이스 클래스이며,이 예에서는 행 유형을 사용하는 것이다;

DataFrame 사용 createDataFrame 함수를 생성 3. 함수 파라미터들은, 동일하지 않은만큼 수신 RDD 개체 (암시 적 모드 오브젝트)이 예와 RDD 스키마 정의를 전달할 필요성 이전 예제와;

실제 프로그래밍, 더 유연하기 때문에, 스키마 정보가 반드시 죽은 기록되지 않을 수 있지만, 프로그램 실행 과정에서 발생 될 수 있으며, 두 번째 방법을 권장합니다.

 

그런 다음을 보장하기 위하여 HiveContext 필요를 사용하기 전에 다음과 같은 HiveContext 사용 보면 :

  • 스파크는 하이브의 사용을 지원하는 것입니다;
  • conf 디렉토리 아래 하이브 하이브를 site.xml 구성 파일은 스파크 이미;
  • 하이브 메타 스토어는 시작되었습니다;

예를 들면 :

먼저 하이브 메타 스토어를 시작합니다 :

[BruceCentOS ~ @ 루트] # nohup을 하이브 --service 메타 스토어 &

아래에 도시 한 바와 같이 여전히 스파크 쉘을 시작 스파크 쉘들 수 :

실 --master [루트 BruceCentOS4 ~ @] # $ SPARK_HOME / 빈 / 스파크 - 쉘

. 스칼라> spark.sql ( "쇼 데이터베이스") collect.foreach (에 println)
[기본]
[orderdb]

스칼라> spark.sql ( "사용 orderdb")
RES2 : org.apache.spark.sql.DataFrame = []

스칼라 > spark.sql ( "쇼 테이블"). collect.foreach (에 println)
[orderdb, 고객, 거짓]
[orderdb, 사무실, 거짓]
[orderdb, 주문, 거짓]
[orderdb, 제품, 거짓]
[orderdb, salesreps, 거짓]

스칼라>지도 spark.sql ( "지역 = '동부는'사무실에서 선택 도시"). (t => "도시 :"+ t (0)) collect.foreach (에 println).
도시 : 뉴욕                                                                   
도시 : 시카고
도시 : 애틀랜타

스칼라>

여기에 우리가 데이터 HiveContext 하이브를 조작하는 데 사용할 때문에 당신은 마지막 옵션을하지 않았다 시작 스파크 쉘을 볼 수 있습니다, 당신은 하이브를 지원 필요. 스파크 - 쉘 위에서 언급 한 바와 같이 기본적 하이브 지원으로 활성화되어 있습니다. 또한 SQL을 조작 할 수 HiveContext 개체 다음 요구되지는 SqlContext 유사한, 스파크 2.X 및 직접 사용 SparkSession 개체로 잘 조작 할 수 있습니다. 여기에 그렇게 직접 SQL이 작동 할 수 스키마는 하이브 메타 스토어의 외부를 정의하기 때문에 테이블이 직접 스키마 정보를 읽어 테이블에 연결하여 스파크 하이브 메타 스토어, 더 이상 정의되지 스키마를 조작 할 수 있음을 알 수있다.

 

외부 (하이브 메타 스토어를 열 필요)는 SqlContext 일반 파일 작업 위 HiveContext 하이브 테이블 데이터를 사용 (추가 정의 모드) 및 운영을을 사용하는 것 외에도, 또한 동작는 SqlContext JSON, 나무 마루 기타 문서를 모두 가져 이후 데이터 파일입니다 모드 정보, 그래서 당신은 같은 파일 기반의 직접 DataFrame를 만들 수 있습니다 :

스칼라> 발 DF = spark.read.json ( "파일 : ///opt/spark/examples/src/main/resources/people.json")
DF : org.apache.spark.sql.DataFrame = [연령 : BIGINT 이름 : 문자열]                

스칼라> df.createOrReplaceTempView ( "사람")

스칼라> spark.sql ( "선택 이름, 나이는> 19명에서 세")지도 (t =>. "이름 :"+ t (0) + "나이 :"+ t (1)) collect.foreach (에 println).
이름 : 앤디, 나이 : 30    

 

또 다른 사용은 DSL (도메인 특정 언어)를 DataFrame의 마지막 모습이라고합니다.

스칼라> 발 DF = spark.read.json ( "파일 : ///opt/spark/examples/src/main/resources/people.json")
DF : org.apache.spark.sql.DataFrame = [연령 : BIGINT 이름 : 문자열]                

스칼라> df.show ()
+ ---- + ------- +                                                                  
| 나이 | 이름 |
+ ---- + ------- +
| 널 (null) | 마이클 |
| 30 | 앤디 |
| 19 | 저스틴 |
+ ---- + ------- +


스칼라> df.select ( "이름") 쇼 ().
+ ------- +                                                                       
| 이름 |
+ ------- +
| 마이클 |
| 앤디 |
| 저스틴 |
+ ------- +


스칼라> df.select (DF ( "이름"), DF ( "세") + 1) .show ()
+ ------- + --------- +                                                             
| 이름 | (나이 + 1) |
+ ------- + --------- +
| 마이클 | 널 (null) |
| 앤디 | 31 |
| 저스틴 | 20 |
+ ------- + --------- +


스칼라> df.filter (DF ( "세")> 21) .show ()
+ --- + ---- +
| 연령 | 이름 |
+ --- + ---- +
| 30 | 앤디 |
+ --- + ---- +


스칼라> df.groupBy ( "세")) (COUNT ()을 보여줍니다..
+ ---- + ----- +                                                                    
| 나이 | 수 |
+ ---- + ----- +
| 19 | 1 |
| 널 (null) | 1 |
| 30 | 1 |
+ ---- + ---- +


스칼라>

이러한 예제는 SqlContext 및 HiveContext 스파크 SQL 사용에 대한 몇 가지 기본적인 요약 스파크 쉘 도구를 사용하는 인용된다. 스파크 - 쉘 실제로 공구 스칼라 프로그램 단편을 실행하기 때문에, 상기 예는 독립적 인 프로그램이 될 수있다. 나는 통계 데이터를 분석하는 더 복잡한 SQL의 일부를 사용하는 것이 적절할 수있다, 예를 하이브 데이터베이스 orderdb 위에 작동하는 별도의 프로그램을 작성하는 스칼라, 자바와 파이썬을 사용하여 그들에게 다음 블로그 게시물을 다할 것입니다.

 

 

 

 

추천

출처www.cnblogs.com/roushi17/p/sqlcontext_hivecontext.html