2014-11-05 3 views
3

여러 개의 org.apache.hadoop 라이브러리를 기반으로하는 스칼라의 MapReduce 프레임 워크가 있습니다. 간단한 단어 카운트 프로그램으로 잘 작동합니다. 그러나, 나는 그것을 유용한 무언가에 적용하고로드 블록을 치고 싶습니다. 나는 csv 파일 (또는 어떤 구분자를 쓰는지)을 가지고 첫 번째 열을 키로 전달한 다음 키의 발생률을 계산하려고한다. 이유형 불일치를 제공하는 스칼라 MapReduce 프레임 워크

class WordCountMapper extends Mapper[LongWritable, Text, Text, LongWritable] with HImplicits { 
    protected override def map(lnNumber: LongWritable, line: Text, context: Mapper[LongWritable, Text, Text, LongWritable]#Context): Unit = { 
    line.split(",", -1)(0) foreach (context.write(_,1)) //Splits data 
    } 
} 

문제는 'line.split'코드 제공처럼

맵퍼 코드가 보인다. 컴파일하려고하면 다음과 같은 오류 메시지가 나타납니다.

: char required : org.apache.hadoop.io.Text.

line.split ... write (_, 1)에서 _에 전달되는 문자열을 반환해야하지만 soem 이유로 it는 char라고 생각합니다. 명시 적으로 문자열을 만들도록 .toString을 추가 했는데도 작동하지 않았습니다.

모든 아이디어는 높이 평가됩니다. 내가 제공 할 수있는 추가 세부 정보를 알려주십시오.

업데이트 : 여기

import org.apache.hadoop.io.{LongWritable, Text} 
import org.apache.hadoop.mapreduce.{Reducer, Job, Mapper} 
import org.apache.hadoop.conf.{Configured} 
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat 
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat 
import scala.collection.JavaConversions._ 
import org.apache.hadoop.util.{ToolRunner, Tool} 

가 build.sbt 코드 : 수입 목록

여기

입니다 내가 line 암시 여기 String으로 변환됩니다 추측

import AssemblyKeys._ // put this at the top of the file 

assemblySettings 

organization := "scala" 

name := "WordCount" 

version := "1.0" 

scalaVersion:= "2.11.2" 

scalacOptions ++= Seq("-no-specialization", "-deprecation") 

libraryDependencies ++= Seq("org.apache.hadoop" % "hadoop-client" % "1.2.1", 
         "org.apache.hadoop" % "hadoop-core" % "latest.integration" exclude ("hadoop-core", "org/apache/hadoop/hdfs/protocol/ClientDatanodeProtocol.class") , 
         "org.apache.hadoop" % "hadoop-common" % "2.5.1", 
         "org.apache.hadoop" % "hadoop-mapreduce-client-core" % "2.5.1", 
         "commons-configuration" % "commons-configuration" % "1.9", 
         "org.apache.hadoop" % "hadoop-hdfs" % "latest.integration") 


jarName in assembly := "WordCount.jar" 

mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) => 
    {case s if s.endsWith(".class") => MergeStrategy.last 
case s if s.endsWith(".xsd") => MergeStrategy.last 
case s if s.endsWith(".dtd") => MergeStrategy.last 
case s if s.endsWith(".xml") => MergeStrategy.last 
case s if s.endsWith(".properties") => MergeStrategy.last 
case x => old(x) 
    } 
} 
+0

가져 오기와 build.sbt 또는 종속성 목록을 제공하여 컴파일하려고 할 수 있습니까? –

+0

'line'은 "Hadoop Writable"'Text'이고, split을 지원하는 Java String을 얻기 위해'toString'을 호출해야합니다. 이 전화를 할 때받는 오류를 알려주십시오. –

+0

@ThomasJungblut, "line.split (", "- 1) (0) .toString"을 사용 하시겠습니까?위와 같은 오류가 발생합니다. –

답변

0

사실 저는 _ 표기법을 사용하지 않고 context.write에 직접 값을 지정함으로써이를 해결했습니다. 그래서 대신 :

line.split(",", -1)(0) foreach (context.write(_,1)) 

내가 사용 :

context.write(line.split(",", -1)(0), 1) 

내가 사용할 때 언젠가 스칼라 데이터 유형에 혼동됩니다 말했다 항목을 온라인으로 볼 수있는 _, 그냥 명시 적으로 추천하는 장소에 값을 정의. 그것이 사실인지 확실하지는 않지만이 경우 문제를 해결했습니다.

+0

'_'로 할 일이 없으며 불필요하게'foreach'를 호출하지 않아도됩니다. –

+0

그건 의미가 있습니다. 그것은 단지 하나의 문자열 (0 번째 항목)을 전달하기 때문에 중요하지 않으며 단지 한 번만 반복 할 것이라고 생각했습니다. 하지만 나는 그 하나의 문자열에서 각 문자를 반복하고 있었다고 생각합니다. –

0

은 (HImplicits 덕분에?). foreach - 다음 문자가 해당 문자열의 이상 somethingOrOther을 반복 (0)

  • -.split(...)
  • 이 문자열의 영차을 - 그리고 우리는
    line.split(",", -1)(0) foreach somethigOrOther 
    
    • 여러 문자열로 문자열을 분할해야

      따라서 char이 표시됩니다.

  • 관련 문제