File "C:\Users\liqiang.yang\PycharmProjects\pythonProject2\yangliqiang\yangliqiang.py", line 23, in get_algo_sequence tmp_power = res['projectPower']
时间: 2023-07-18 20:46:35 浏览: 82
这行代码尝试从一个名为'res'的变量中获取键值为'projectPower'的值。但是,由于'res'变量为NoneType,不能进行子脚本操作,因此该行代码出现错误。要解决这个问题,你需要检查'res'变量是否已被正确地初始化并设置了值,以及是否具有键'projectPower'。你可以在调用'res'变量之前,使用条件语句或异常处理来检查其是否为NoneType。如果'res'变量是NoneType,你需要查找出错的原因并解决它。
相关问题
Traceback (most recent call last): File "C:\Users\liqiang.yang\PycharmProjects\pythonProject2\yangliqiang\yangliqiang.py", line 66, in <module> get_algo_sequence(farm_id, start_time, end_time) File "C:\Users\liqiang.yang\PycharmProjects\pythonProject2\yangliqiang\yangliqiang.py", line 23, in get_algo_sequence tmp_power = res['projectPower'] TypeError: 'NoneType' object is not subscriptable
这个错误通常发生在你试图从 NoneType 变量中获取值时。在你的代码中,出现了一个名为 'res' 的变量,但它的值为 NoneType,因此无法进行子脚本操作。你需要确认这个变量是否被正确地初始化或设置了值。你可以使用 Python 的条件语句来检查变量是否为 NoneType,以避免这种错误的发生。
这里有三个数据表,如表1、2和3所示。要求:(1)通过MapReduce,能将表格信息根据关联字段进行合并处理,结果如表4所示;(2)通过Hive Api创建表4结果对应的外部表;(3)创建一个Hive 自定义函数(如取名myfun),调用该UDF时,结果显示你的学号姓名为前缀,然后再接对应字段内容,如: select myfun(科目) from 表4 limit 1, 结果为: “101 liqiang计算机组成原理”
很高兴为您解答。根据您提供的表结构和数据,我可以给出以下的答案:
1. MapReduce实现表格信息合并
假设表1、表2和表3分别存储在Hadoop的hdfs文件系统中,路径分别为 /data/table1, /data/table2 和 /data/table3。关联字段为"学号"。下面是MapReduce程序的代码示例:
```java
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
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 TableJoinMR {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "TableJoin");
job.setJarByClass(TableJoinMR.class);
job.setMapperClass(TableJoinMapper.class);
job.setReducerClass(TableJoinReducer.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileInputFormat.addInputPath(job, new Path(args[1]));
FileInputFormat.addInputPath(job, new Path(args[2]));
FileOutputFormat.setOutputPath(job, new Path(args[3]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
```
Mapper的代码如下:
```java
import java.io.IOException;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
public class TableJoinMapper extends Mapper<LongWritable, Text, Text, Text> {
private Text outKey = new Text();
private Text outValue = new Text();
private String tableName;
public void setup(Context context) {
tableName = context.getInputSplit().toString();
}
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString();
String[] fields = line.split(",");
if (fields.length != 3) {
return;
}
outKey.set(fields[0]);
outValue.set(tableName + "," + fields[1] + "," + fields[2]);
context.write(outKey, outValue);
}
}
```
Reducer的代码如下:
```java
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
public class TableJoinReducer extends Reducer<Text, Text, Text, Text> {
private Text outValue = new Text();
public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
List<String> table1 = new ArrayList<>();
List<String> table2 = new ArrayList<>();
List<String> table3 = new ArrayList<>();
for (Text value : values) {
String[] fields = value.toString().split(",");
String tableName = fields[0];
String column1 = fields[1];
String column2 = fields[2];
if (tableName.equals("Table1")) {
table1.add(column1 + "," + column2);
} else if (tableName.equals("Table2")) {
table2.add(column1 + "," + column2);
} else if (tableName.equals("Table3")) {
table3.add(column1 + "," + column2);
}
}
for (String t1 : table1) {
for (String t2 : table2) {
for (String t3 : table3) {
outValue.set(t1 + "," + t2 + "," + t3);
context.write(key, outValue);
}
}
}
}
}
```
2. Hive创建外部表4
根据表4的结构,可以使用以下HiveQL语句创建外部表:
```sql
CREATE EXTERNAL TABLE table4 (
学号 INT,
姓名 STRING,
科目 STRING,
成绩 INT
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/data/table4';
```
其中,LOCATION指定了表4的存储路径。
3. Hive自定义函数
可以使用以下Java代码实现Hive的自定义函数myfun:
```java
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
public class MyUDF extends UDF {
public Text evaluate(Text input) {
String studentInfo = "101 liqiang";
return new Text(studentInfo + input.toString());
}
}
```
然后,可以使用以下HiveQL语句注册和调用UDF:
```sql
ADD JAR /path/to/myudf.jar;
CREATE TEMPORARY FUNCTION myfun AS 'com.example.MyUDF';
SELECT myfun(科目) FROM table4 LIMIT 1;
```
其中,/path/to/myudf.jar是MyUDF所在的Java包的路径。请确保在Hive的配置文件hive-site.xml中设置了hive.aux.jars.path参数,使得Hive可以加载该Jar包。
阅读全文