getWritableDb失败——java.io.File android.content.Context.getDatabasePath(java.lang.String)'

new SQLiteOpenHelper()时,Context不能是Application。如果传入Application,会java.io.File android.content.Context.getDatabasePath(java.lang.String)' on a null object reference

 

Process: com.ader.testgreendao, PID: 27131
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.File android.content.Context.getDatabasePath(java.lang.String)' on a null object reference
        at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:367)
        at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:313)
        at org.greenrobot.greendao.database.DatabaseOpenHelper.getWritableDb(DatabaseOpenHelper.java:59)
        at com.ader.testgreendao.database.DaoManager.<init>(DaoManager.java:31)
        at com.ader.testgreendao.database.DaoManager.getInstance(DaoManager.java:48)
        at com.ader.testgreendao.business.test.CreateDaoActivity.getData(CreateDaoActivity.java:49)
        at com.ader.testgreendao.business.test.CreateDaoActivity.onClick(CreateDaoActivity.java:38)
        at android.view.View.performClick(View.java:6663)
        at android.view.View.performClickInternal(View.java:6635)
        at android.view.View.access$3100(View.java:794)
        at android.view.View$PerformClick.run(View.java:26199)
        at android.os.Handler.handleCallback(Handler.java:907)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:216)
        at android.app.ActivityThread.main(ActivityThread.java:7625)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)
    

package mergeData.mapreduce; import org.apache.commons.lang.StringUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.NullWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.input.FileSplit; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashMap; public class MergeDataDriver { /********** Begin **********/ public static class Map extends Mapper{LongWritable, Text, NullWritable,Text>{} /********** End **********/ } /********** Begin **********/ public static class Reduce extends Reducer{ } /********** End **********/ public static void main(String[] args) throws Exception { //创建配置信息 Configuration conf = new Configuration(); // 创建任务 Job job = Job.getInstance(conf); //如果输出目录存在,我们就删除 String outputpath = "/root/files"; Path path = new Path(outputpath); FileSystem fileSystem = path.getFileSystem(conf); if (fileSystem.exists(path)) { fileSystem.delete(path, true); } /********** Begin **********/ //设置执行类 //设置自定义Mapper类 //设置自定义Reducer类(若没用reduce可删除) //设置map函数输出数据的key和value的类型 //设置reduce函数输出数据的key和value的类型(若没用reduce可删除) //设置输入输出路径 /********** End **********/ //提交作业,若成功返回true,失败返回falase boolean b = job.waitForCompletion(true); if (b
最新发布
03-21
### Hadoop MapReduce 中 Mapper 和 Reducer 的实现与 Job 配置 #### 1. Mapper 类的实现 Mapper 是 MapReduce 程序的核心组件之一,负责处理输入数据并将它们转换为中间键值对。如果未显式定义,则会使用默认的 `IdentityMapper`。 在自定义实现时,需继承 `org.apache.hadoop.mapreduce.Mapper` 接口,并重写其方法: - **setup() 方法**: 初始化阶段运行一次。 - **map() 方法**: 对每条输入记录调用一次。 - **cleanup() 方法**: 处理完成后运行一次。 以下是示例代码片段: ```java import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; public class WordCountMapper extends Mapper<LongWritable, Text, Text, LongWritable> { private final static LongWritable one = new LongWritable(1); private Text word = new Text(); @Override protected void setup(Context context) throws IOException, InterruptedException { // 可在此处初始化资源或变量 } @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); for (String token : line.split("\\s+")) { // 假设以空格分割单词 word.set(token); context.write(word, one); // 输出<word, 1> } } @Override protected void cleanup(Context context) throws IOException, InterruptedException { // 清理操作可放在这里 } } ``` 上述代码实现了简单的词频统计功能[^2]。 --- #### 2. Reducer 类的实现 Reducer 负责接收来自多个 Mapper 的相同 Key 的 Value 列表,并对其进行汇总或其他计算逻辑。如果不提供自定义 Reducer,默认会使用 `IdentityReducer`。 同样需要继承 `org.apache.hadoop.mapreduce.Reducer` 并覆盖相应的方法: - **setup() 方法**: 减少任务启动前的一次性设置工作。 - **reduce() 方法**: 按照相同的 Key 合并所有的 Values。 - **cleanup() 方法**: 执行清理动作。 下面是一个典型的 Reducer 实现例子: ```java import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; public class WordCountReducer extends Reducer<Text, LongWritable, Text, LongWritable> { @Override protected void setup(Context context) throws IOException, InterruptedException { // 设置环境参数等 } @Override protected void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException { long sum = 0L; for (LongWritable val : values) { sum += val.get(); // 将所有值相加得到总数 } context.write(key, new LongWritable(sum)); // 输出<word, total_count> } @Override protected void cleanup(Context context) throws IOException, InterruptedException { // 关闭连接或者释放资源 } } ``` 此部分展示了如何将 Mapper 发送过来的结果进一步加工成最终输出[^3]。 --- #### 3. Job 配置实例分析 为了使整个流程正常运作起来,还需要编写驱动程序来配置和提交作业。这通常涉及以下几个方面: - 输入路径、输出路径设定; - 自定义 Mapper 和 Reducer 注册; - 数据序列化格式声明; - Combiner 或 Partitioner 定义(如有必要); 完整的 Java 示例如下所示: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class WordCountDriver { public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf, "Word Count Example"); job.setJarByClass(WordCountDriver.class); FileInputFormat.addInputPath(job, new Path(args[0])); // 输入目录 FileOutputFormat.setOutputPath(job, new Path(args[1])); // 输出目录 job.setMapperClass(WordCountMapper.class); job.setCombinerClass(WordCountReducer.class); // 使用 Reduce 功能作为 Combine 步骤优化性能 job.setReducerClass(WordCountReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(LongWritable.class); System.exit(job.waitForCompletion(true) ? 0 : 1); } } ``` 这段脚本设置了基本的工作流结构,并指定了所需的类文件位置以及 I/O 参数[^1]。 --- ### 总结说明 以上分别介绍了 Mapper 和 Reducer 的具体编码方式及其背后原理,同时也提供了实际应用中的 Driver 设计思路。通过这些步骤可以构建出一个标准的分布式批处理应用程序。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值