一种处理Hive元数据与文件类型不同时SQL查询失败的方法(二)

2023-05-16

文章目录

  • 一、异常触发SQL
  • 二、异常处理
  • 三、Hive on Spark依赖的Hive jar包部署

继上一篇之后,又发现了一种新的报错位置。本篇对这种情况进行处理,并验证这种处理方式是否适用于Hive on Spark环境。

一、异常触发SQL

构造测试数据
(1) 建表,插入数据

create table t1(id float,content string) stored as parquet;
insert into t1 vlaues(1.1,'content1'),(2.2,'content2');
create table error_type(id int,content string) stored as parquet;

(2) 拷贝文件到类型不兼容的表

hdfs dfs -cp /user/hive/warehouse/testdb.db/t1/000000_0 /user/hive/warehouse/testdb.db/error_type/

在前面两步之后,执行如下SQL:

select * from error_type where content='content1';

报错并有如下错误日志:

Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing row [Error getting row data with exception java.lang.ClassCastException: org.apache.hadoop.io.FloatWritable cannot be cast to org.apache.hadoop.io.IntWritable
	at org.apache.hadoop.hive.serde2.objectinspector.primitive.WritableIntObjectInspector.get(WritableIntObjectInspector.java:36)
	at org.apache.hadoop.hive.serde2.SerDeUtils.buildJSONString(SerDeUtils.java:227)
	at org.apache.hadoop.hive.serde2.SerDeUtils.buildJSONString(SerDeUtils.java:364)
	at org.apache.hadoop.hive.serde2.SerDeUtils.getJSONString(SerDeUtils.java:200)
	at org.apache.hadoop.hive.serde2.SerDeUtils.getJSONString(SerDeUtils.java:186)
	at org.apache.hadoop.hive.ql.exec.MapOperator.toErrorMessage(MapOperator.java:520)
	at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:489)
	at org.apache.hadoop.hive.ql.exec.spark.SparkMapRecordHandler.processRow(SparkMapRecordHandler.java:133)
	at org.apache.hadoop.hive.ql.exec.spark.HiveMapFunctionResultList.processNextRecord(HiveMapFunctionResultList.java:48)
	at org.apache.hadoop.hive.ql.exec.spark.HiveMapFunctionResultList.processNextRecord(HiveMapFunctionResultList.java:27)
	at org.apache.hadoop.hive.ql.exec.spark.HiveBaseFunctionResultList.hasNext(HiveBaseFunctionResultList.java:85)
	at scala.collection.convert.Wrappers$JIteratorWrapper.hasNext(Wrappers.scala:42)
	at scala.collection.Iterator$class.foreach(Iterator.scala:891)
	at scala.collection.AbstractIterator.foreach(Iterator.scala:1334)
	at org.apache.spark.rdd.AsyncRDDActions$$anonfun$foreachAsync$1$$anonfun$apply$12.apply(AsyncRDDActions.scala:127)
	at org.apache.spark.rdd.AsyncRDDActions$$anonfun$foreachAsync$1$$anonfun$apply$12.apply(AsyncRDDActions.scala:127)
	at org.apache.spark.SparkContext$$anonfun$38.apply(SparkContext.scala:2232)
	at org.apache.spark.SparkContext$$anonfun$38.apply(SparkContext.scala:2232)
	at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:90)
	at org.apache.spark.scheduler.Task.run(Task.scala:121)
	at org.apache.spark.executor.Executor$TaskRunner$$anonfun$11.apply(Executor.scala:407)
	at org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1408)
	at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:413)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)
 ]
	at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:494) ~[hive-exec-2.1.1-cdh6.3.0.jar:2.1.1-cdh6.3.0]
	at org.apache.hadoop.hive.ql.exec.spark.SparkMapRecordHandler.processRow(SparkMapRecordHandler.java:133) ~[hive-exec-2.1.1-cdh6.3.0.jar:2.1.1-cdh6.3.0]
	at org.apache.hadoop.hive.ql.exec.spark.HiveMapFunctionResultList.processNextRecord(HiveMapFunctionResultList.java:48) ~[hive-exec-2.1.1-cdh6.3.0.jar:2.1.1-cdh6.3.0]
	at org.apache.hadoop.hive.ql.exec.spark.HiveMapFunctionResultList.processNextRecord(HiveMapFunctionResultList.java:27) ~[hive-exec-2.1.1-cdh6.3.0.jar:2.1.1-cdh6.3.0]
	at org.apache.hadoop.hive.ql.exec.spark.HiveBaseFunctionResultList.hasNext(HiveBaseFunctionResultList.java:85) ~[hive-exec-2.1.1-cdh6.3.0.jar:2.1.1-cdh6.3.0]
	at scala.collection.convert.Wrappers$JIteratorWrapper.hasNext(Wrappers.scala:42) ~[scala-library-2.11.12.jar:?]
	at scala.collection.Iterator$class.foreach(Iterator.scala:891) ~[scala-library-2.11.12.jar:?]
	at scala.collection.AbstractIterator.foreach(Iterator.scala:1334) ~[scala-library-2.11.12.jar:?]
	at org.apache.spark.rdd.AsyncRDDActions$$anonfun$foreachAsync$1$$anonfun$apply$12.apply(AsyncRDDActions.scala:127) ~[spark-core_2.11-2.4.0-cdh6.3.0.jar:2.4.0-cdh6.3.0]
	at org.apache.spark.rdd.AsyncRDDActions$$anonfun$foreachAsync$1$$anonfun$apply$12.apply(AsyncRDDActions.scala:127) ~[spark-core_2.11-2.4.0-cdh6.3.0.jar:2.4.0-cdh6.3.0]
	at org.apache.spark.SparkContext$$anonfun$38.apply(SparkContext.scala:2232) ~[spark-core_2.11-2.4.0-cdh6.3.0.jar:2.4.0-cdh6.3.0]
	at org.apache.spark.SparkContext$$anonfun$38.apply(SparkContext.scala:2232) ~[spark-core_2.11-2.4.0-cdh6.3.0.jar:2.4.0-cdh6.3.0]
	at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:90) ~[spark-core_2.11-2.4.0-cdh6.3.0.jar:2.4.0-cdh6.3.0]
	at org.apache.spark.scheduler.Task.run(Task.scala:121) ~[spark-core_2.11-2.4.0-cdh6.3.0.jar:2.4.0-cdh6.3.0]
	at org.apache.spark.executor.Executor$TaskRunner$$anonfun$11.apply(Executor.scala:407) ~[spark-core_2.11-2.4.0-cdh6.3.0.jar:2.4.0-cdh6.3.0]
	at org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1408) ~[spark-core_2.11-2.4.0-cdh6.3.0.jar:2.4.0-cdh6.3.0]
	at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:413) ~[spark-core_2.11-2.4.0-cdh6.3.0.jar:2.4.0-cdh6.3.0]
	... 3 more
Caused by: java.lang.ClassCastException: org.apache.hadoop.io.FloatWritable cannot be cast to org.apache.hadoop.io.IntWritable
	at org.apache.hadoop.hive.serde2.objectinspector.primitive.WritableIntObjectInspector.get(WritableIntObjectInspector.java:36) ~[hive-exec-2.1.1-cdh6.3.0.jar:2.1.1-cdh6.3.0]
	at org.apache.hadoop.hive.serde2.lazy.LazyUtils.writePrimitiveUTF8(LazyUtils.java:251) ~[hive-exec-2.1.1-cdh6.3.0.jar:2.1.1-cdh6.3.0]
	at org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe.serialize(LazySimpleSerDe.java:292) ~[hive-exec-2.1.1-cdh6.3.0.jar:2.1.1-cdh6.3.0]
	at org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe.serializeField(LazySimpleSerDe.java:247) ~[hive-exec-2.1.1-cdh6.3.0.jar:2.1.1-cdh6.3.0]
	at org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe.doSerialize(LazySimpleSerDe.java:231) ~[hive-exec-2.1.1-cdh6.3.0.jar:2.1.1-cdh6.3.0]
	at org.apache.hadoop.hive.serde2.AbstractEncodingAwareSerDe.serialize(AbstractEncodingAwareSerDe.java:55) ~[hive-exec-2.1.1-cdh6.3.0.jar:2.1.1-cdh6.3.0]
	at org.apache.hadoop.hive.ql.exec.FileSinkOperator.process(FileSinkOperator.java:732) ~[hive-exec-2.1.1-cdh6.3.0.jar:2.1.1-cdh6.3.0]
	at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:882) ~[hive-exec-2.1.1-cdh6.3.0.jar:2.1.1-cdh6.3.0]
	at org.apache.hadoop.hive.ql.exec.SelectOperator.process(SelectOperator.java:95) ~[hive-exec-2.1.1-cdh6.3.0.jar:2.1.1-cdh6.3.0]
	at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:882) ~[hive-exec-2.1.1-cdh6.3.0.jar:2.1.1-cdh6.3.0]
	at org.apache.hadoop.hive.ql.exec.FilterOperator.process(FilterOperator.java:126) ~[hive-exec-2.1.1-cdh6.3.0.jar:2.1.1-cdh6.3.0]
	at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:882) ~[hive-exec-2.1.1-cdh6.3.0.jar:2.1.1-cdh6.3.0]
	at org.apache.hadoop.hive.ql.exec.TableScanOperator.process(TableScanOperator.java:130) ~[hive-exec-2.1.1-cdh6.3.0.jar:2.1.1-cdh6.3.0]
	at org.apache.hadoop.hive.ql.exec.MapOperator$MapOpCtx.forward(MapOperator.java:146) ~[hive-exec-2.1.1-cdh6.3.0.jar:2.1.1-cdh6.3.0]
	at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:484) ~[hive-exec-2.1.1-cdh6.3.0.jar:2.1.1-cdh6.3.0]
	at org.apache.hadoop.hive.ql.exec.spark.SparkMapRecordHandler.processRow(SparkMapRecordHandler.java:133) ~[hive-exec-2.1.1-cdh6.3.0.jar:2.1.1-cdh6.3.0]
	at org.apache.hadoop.hive.ql.exec.spark.HiveMapFunctionResultList.processNextRecord(HiveMapFunctionResultList.java:48) ~[hive-exec-2.1.1-cdh6.3.0.jar:2.1.1-cdh6.3.0]
	at org.apache.hadoop.hive.ql.exec.spark.HiveMapFunctionResultList.processNextRecord(HiveMapFunctionResultList.java:27) ~[hive-exec-2.1.1-cdh6.3.0.jar:2.1.1-cdh6.3.0]
	at org.apache.hadoop.hive.ql.exec.spark.HiveBaseFunctionResultList.hasNext(HiveBaseFunctionResultList.java:85) ~[hive-exec-2.1.1-cdh6.3.0.jar:2.1.1-cdh6.3.0]
	at scala.collection.convert.Wrappers$JIteratorWrapper.hasNext(Wrappers.scala:42) ~[scala-library-2.11.12.jar:?]
	at scala.collection.Iterator$class.foreach(Iterator.scala:891) ~[scala-library-2.11.12.jar:?]
	at scala.collection.AbstractIterator.foreach(Iterator.scala:1334) ~[scala-library-2.11.12.jar:?]
	at org.apache.spark.rdd.AsyncRDDActions$$anonfun$foreachAsync$1$$anonfun$apply$12.apply(AsyncRDDActions.scala:127) ~[spark-core_2.11-2.4.0-cdh6.3.0.jar:2.4.0-cdh6.3.0]
	at org.apache.spark.rdd.AsyncRDDActions$$anonfun$foreachAsync$1$$anonfun$apply$12.apply(AsyncRDDActions.scala:127) ~[spark-core_2.11-2.4.0-cdh6.3.0.jar:2.4.0-cdh6.3.0]
	at org.apache.spark.SparkContext$$anonfun$38.apply(SparkContext.scala:2232) ~[spark-core_2.11-2.4.0-cdh6.3.0.jar:2.4.0-cdh6.3.0]
	at org.apache.spark.SparkContext$$anonfun$38.apply(SparkContext.scala:2232) ~[spark-core_2.11-2.4.0-cdh6.3.0.jar:2.4.0-cdh6.3.0]
	at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:90) ~[spark-core_2.11-2.4.0-cdh6.3.0.jar:2.4.0-cdh6.3.0]
	at org.apache.spark.scheduler.Task.run(Task.scala:121) ~[spark-core_2.11-2.4.0-cdh6.3.0.jar:2.4.0-cdh6.3.0]
	at org.apache.spark.executor.Executor$TaskRunner$$anonfun$11.apply(Executor.scala:407) ~[spark-core_2.11-2.4.0-cdh6.3.0.jar:2.4.0-cdh6.3.0]
	at org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1408) ~[spark-core_2.11-2.4.0-cdh6.3.0.jar:2.4.0-cdh6.3.0]
	at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:413) ~[spark-core_2.11-2.4.0-cdh6.3.0.jar:2.4.0-cdh6.3.0]
	... 3 more

二、异常处理

其中org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe.doSerialize(LazySimpleSerDe.java:231)函数中有序列化每个字段的逻辑:

  /**
   * Serialize a row of data.
   *
   * @param obj
   *          The row object
   * @param objInspector
   *          The ObjectInspector for the row object
   * @return The serialized Writable object
   * @throws IOException
   * @see SerDe#serialize(Object, ObjectInspector)
   */
  @Override
  public Writable doSerialize(Object obj, ObjectInspector objInspector)
      throws SerDeException {

    if (objInspector.getCategory() != Category.STRUCT) {
      throw new SerDeException(getClass().toString()
          + " can only serialize struct types, but we got: "
          + objInspector.getTypeName());
    }

    // Prepare the field ObjectInspectors
    StructObjectInspector soi = (StructObjectInspector) objInspector;
    List<? extends StructField> fields = soi.getAllStructFieldRefs();
    List<Object> list = soi.getStructFieldsDataAsList(obj);
    List<? extends StructField> declaredFields = (serdeParams.getRowTypeInfo() != null && ((StructTypeInfo) serdeParams.getRowTypeInfo())
        .getAllStructFieldNames().size() > 0) ? ((StructObjectInspector) getObjectInspector())
        .getAllStructFieldRefs()
        : null;

    serializeStream.reset();
    serializedSize = 0;

    // Serialize each field
    for (int i = 0; i < fields.size(); i++) {
      // Append the separator if needed.
      if (i > 0) {
        serializeStream.write(serdeParams.getSeparators()[0]);
      }
      // Get the field objectInspector and the field object.
      ObjectInspector foi = fields.get(i).getFieldObjectInspector();
      Object f = (list == null ? null : list.get(i));

      if (declaredFields != null && i >= declaredFields.size()) {
        throw new SerDeException("Error: expecting " + declaredFields.size()
            + " but asking for field " + i + "\n" + "data=" + obj + "\n"
            + "tableType=" + serdeParams.getRowTypeInfo().toString() + "\n"
            + "dataType="
            + TypeInfoUtils.getTypeInfoFromObjectInspector(objInspector));
      }

      serializeField(serializeStream, f, foi, serdeParams);
    }

    // TODO: The copy of data is unnecessary, but there is no work-around
    // since we cannot directly set the private byte[] field inside Text.
    serializeCache
        .set(serializeStream.getData(), 0, serializeStream.getLength());
    serializedSize = serializeStream.getLength();
    lastOperationSerialize = true;
    lastOperationDeserialize = false;
    return serializeCache;
  }

for循环中的最后一行serializeField(serializeStream, f, foi, serdeParams);调用的即是异常堆栈中的org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe.serializeField(LazySimpleSerDe.java:247)函数:

  protected void serializeField(ByteStream.Output out, Object obj, ObjectInspector objInspector,
      LazySerDeParameters serdeParams) throws SerDeException {
    try {
      serialize(out, obj, objInspector, serdeParams.getSeparators(), 1, serdeParams.getNullSequence(),
          serdeParams.isEscaped(), serdeParams.getEscapeChar(), serdeParams.getNeedsEscape());
    } catch (IOException e) {
      throw new SerDeException(e);
    }
  }

serializeField中调用的serialize函数为异常堆栈中的org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe.serialize(LazySimpleSerDe.java:292)函数:

  /**
   * Serialize the row into the StringBuilder.
   *
   * @param out
   *          The StringBuilder to store the serialized data.
   * @param obj
   *          The object for the current field.
   * @param objInspector
   *          The ObjectInspector for the current Object.
   * @param separators
   *          The separators array.
   * @param level
   *          The current level of separator.
   * @param nullSequence
   *          The byte sequence representing the NULL value.
   * @param escaped
   *          Whether we need to escape the data when writing out
   * @param escapeChar
   *          Which char to use as the escape char, e.g. '\\'
   * @param needsEscape
   *          Which byte needs to be escaped for 256 bytes. 
   * @throws IOException
   * @throws SerDeException
   */
  public static void serialize(ByteStream.Output out, Object obj,
      ObjectInspector objInspector, byte[] separators, int level,
      Text nullSequence, boolean escaped, byte escapeChar, boolean[] needsEscape)
      throws IOException, SerDeException {

    if (obj == null) {
      out.write(nullSequence.getBytes(), 0, nullSequence.getLength());
      return;
    }

    char separator;
    List<?> list;
    switch (objInspector.getCategory()) {
    case PRIMITIVE:
      LazyUtils.writePrimitiveUTF8(out, obj,
          (PrimitiveObjectInspector) objInspector, escaped, escapeChar,
          needsEscape);
      return;
    case LIST:
      ......
      return;
    case MAP:
      ......
      return;
    case STRUCT:
      ......
      return;
    case UNION:
      ......
      return;
    default:
      break;
    }

    throw new RuntimeException("Unknown category type: "
        + objInspector.getCategory());
  }

在这个函数中,调用后续针对特定类型的函数对特定类型进行序列化,类型不兼容时则抛出异常。可以看到当前字段数据为空时,有如下逻辑:

if (obj == null) {
      out.write(nullSequence.getBytes(), 0, nullSequence.getLength());
      return;
    }

所以还是可以在LazySimpleSerDe.doSerialize函数中处理每个字段的逻辑中,捕获ClassCastException,并参考serialize函数这种逻辑写入空值,将LazySimpleSerDe.doSerialize

serializeField(serializeStream, f, foi, serdeParams);

改成

try {
    serializeField(serializeStream, f, foi, serdeParams);
} catch (ClassCastException | UnsupportedOperationException e) {
    serializeStream.write(serdeParams.getNullSequence().getBytes(), 0, serdeParams.getNullSequence().getLength());
}

三、Hive on Spark依赖的Hive jar包部署

上面代码修改后,用前一篇文章中的copy_jars.sh脚本将hive*.jar部署后,Hive默认的MR执行引擎已经可以执行本文开始提到的会报错的SQL,但是当Hive使用Spark作为执行引擎时(如beeline中可通过set hive.execution.engine=spark;设置),仍然会报错,猜测Spark使用的Hive依赖包在另外的位置也存放了一份。

从前面的日志可以看出,一部分日志后面都显示了hive-exec-2.1.1-cdh6.3.0.jar这个jar包名,在部署了CDH的主机上搜索这个jar包:

[root@dev-master2 tmp]# find / -name hive-exec-2.1.1-cdh6.3.0.jar
/opt/cloudera/cm/cloudera-navigator-server/libs/cdh6/hive-exec-2.1.1-cdh6.3.0.jar
/opt/cloudera/cm/cloudera-scm-telepub/libs/cdh6/hive-exec-2.1.1-cdh6.3.0.jar
/opt/cloudera/parcels/CDH-6.3.0-1.cdh6.3.0.p0.1279813/jars/hive-exec-2.1.1-cdh6.3.0.jar
/opt/cloudera/parcels/CDH-6.3.0-1.cdh6.3.0.p0.1279813/lib/spark/hive/hive-exec-2.1.1-cdh6.3.0.jar
/opt/cloudera/parcels/CDH-6.3.0-1.cdh6.3.0.p0.1279813/lib/hive/lib/hive-exec-2.1.1-cdh6.3.0.jar
/opt/cloudera/parcels/CDH-6.3.0-1.cdh6.3.0.p0.1279813/lib/oozie/embedded-oozie-server/webapp/WEB-INF/lib/hive-exec-2.1.1-cdh6.3.0.jar

看起来/opt/cloudera/parcels/CDH-6.3.0-1.cdh6.3.0.p0.1279813/lib/spark/hive/hive-exec-2.1.1-cdh6.3.0.jar这个就是Spark使用的Hive依赖包存放位置,且这个目录下只有一个jar包:

[root@dev-master2 tmp]# ls -lh /opt/cloudera/parcels/CDH-6.3.0-1.cdh6.3.0.p0.1279813/lib/spark/hive/
total 35M
-rw-r--r--. 1 root root 35M Jul 19  2019 hive-exec-2.1.1-cdh6.3.0.jar

所以在copy_jars.sh中添加一句

cp $current_dir/hive-exec-2.1.1-cdh6.3.0.jar /opt/cloudera/parcels/CDH-6.3.0-1.cdh6.3.0.p0.1279813/lib/spark/hive/

再重新部署,经测试,Hive on Spark已经可以查询类型不兼容的类型,结果显示为空值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一种处理Hive元数据与文件类型不同时SQL查询失败的方法(二) 的相关文章

  • 使用BitLocker实现磁盘加密、u盘加密、移动硬盘加密

    一 使用系统自带的工具BitLocker实现 Bitlocker是属于win7版本以后有的系统功能 Windows BitLocker驱动器加密通过加密Windows操作系统卷上存储的所有数据可以更好地保护计算机中的数据 BitLocker
  • k8s的dashboard无法正常访问

    本场景为使用google浏览器访问vmware搭建的虚拟机 建议使用google浏览器的无痕模式 网页提示信息Client sent an HTTP request to an HTTPS server 原因 xff1a 因为直接使用ip
  • k8s删除pod失败,一直处于deleted的界面

    我们在删除pod的时候出现以下情况 xff1a span class token comment 删除pod span span class token punctuation span root 64 master1 yaml span
  • journalctl命令

    journalctl简介 journalctl命令是Systemd的 个命令 xff0c 是用来管理查看日志信息的 因为日志的信息多 xff0c 复杂 xff0c journalctl命令用参数的方式来帮助用户更快地定位日志 注释 xff1
  • 如何在微信小程序里使用Lottie动画库

    先看效果图 xff1a 前言 xff1a 微信小程序的lottie动画库是按照lottie web动画库改造而来 参考lottie web xff1a https github com airbnb lottie web xff0c 以及官
  • mysql中grant all privileges on赋给用户远程权限

    mysql中grant all privileges on赋给用户远程权限 改表法 当你的帐号不允许从远程登陆 xff0c 只能在localhost连接时 这个时候只要在mysql服务器上 xff0c 更改 mysql 数据库里的 user
  • Shell之function函数的定义及调用

    文章目录 96 function 96 函数的定义及调用 96 function 96 函数的定义 96 function 96 函数的调用 位置传参 函数使用return返回值 位置传参 函数的调用 数组传参 function函数的定义及
  • springboot集成activeMQ实现Queue队列

    1 首先下载 activeMQ地址 xff1a https activemq apache org 下载完成以后 xff0c 进行启动 启动步骤很简单 xff0c 就tomcat差不多 这里要注意 xff0c 看你电脑是32位还是64位 x
  • Docker Desktop Vmmem内存占用过高问题解决方案

    Docker Desktop Vmmem内存占用过高问题解决方案 内存占用过高原因 主要原因是docker desktop的实现及基于wsl Windows子系统 相当于在Windows上同时开了一个虚拟机 如果不对wsl的资源进行限制 它
  • spring mvc 预习

    spring mvc 概述 Web 框架 xff0c 是目前最主流的 MVC 框架之一 Spring3 0 后全面超越 Struts2 xff0c 成为最优秀的 MVC 框架 Spring MVC 通过一套 MVC 注解 xff0c 让 P
  • windows server 2012 进程 出现大量桌面窗口管理器的 解决方法

    windows server 2012 进程 出现 桌面窗口管理器 打开运行 打Cmd xff0c 执行 taskkill f im winlogon exe t 记住 这个命令会让远程桌面黑屏 xff0c 不要着急 xff0c 远程按下C
  • 在线医疗系统(毕设)

    小白的成长之路从自己写毕设开始 从整个设计说明书中截取了一部分 相关技术 Springboot VUE MySQL数据库 Bootstrap AJAX 融云 shiro等总体设计 数据库相关表设计 数据库截图了一张图 详细设计与实现 系统整
  • Android 终极推送方案(结束应用进程依然可以接收通知)

    开发中总会遇到产品经理需求是 xff1a 结束掉应用依然想接收到通知 xff0c iOS轻而易举就可以实现 xff0c 但Android一直都是杀掉应用后就无法接收到通知 xff01 网上给的结果大概是 xff1a 1 集成各大厂商的推送s
  • error: resource android:attr/lStar not found完美解决

    今天突然项目出现如下错误 xff0c 编译就报错 D AndroidProjects XXXXX app build intermediates incremental mergeDebugResources merged dir valu
  • android 动态引用含占位符的字符串时,出现红波浪线如何解决

    现象 xff1a 在开发时 xff0c 想动态引用含占位符的字符串 xff0c 发现有红色波浪线警告 xff0c 项目可以正常运行 xff0c 既然是警告 xff0c 肯定就是我们代码有问题 将鼠标放上去提示警告 xff1a Format
  • Mac电脑安装apktool工具包

    开发中少不了想看看别人怎么实现某个功能 xff0c 于是会用到apktool反编译apk xff0c apktool工具包是一个压缩包 xff0c 下载后无需安装 xff0c 简单配置下执行命令就能反编译apk了 xff0c 下面我们看一下
  • 查看 AndroidManifest.xml 文件内容,解决全是二进制代码问题

    想查看打包后apk的AndroidManifest xml文件内容 xff0c 之前都是将后缀apk改为zip xff0c 直接解压查看 xff0c 有时会遇到都是二进制代码 xff0c 给出集中查看明文的方法 xff1a 方法一 通过an
  • unknown error (Sqlite code 14): Could not open database解决方案

    今天在运行之前一个项目是突然一运行就崩溃 xff0c 感觉甚是奇怪 xff0c 查看log日志发现 Caused by android database sqlite SQLiteCantOpenDatabaseException unkn
  • Android RecyclerView Item点击事件

    RecyclerView控件出来后可以代替ListView xff0c 功能更强大 xff0c 但是RecyclerView却没有ListView的setOnItemClickListener和setOnLongClickListener方
  • GitHub上README.md编写教程(基本语法)

    今天在编写github中的readme md文档时 xff0c 发现自己写的和别人写的样式完全不一样 xff0c 自己的好难看 xff0c 于是百度了一番 xff0c 很多都是转载的别人13年的博客 xff0c 其中还发现一片17年写的原创

随机推荐

  • android 平板适配

    首次进行平板开发 xff0c 从一开始就在琢磨适配是怎么弄的 xff0c 百度 google 群一大圈 xff0c 还是没人告诉具体是怎么做的 xff0c 都是基本的概念性的讲述怎么适配 xff0c 写了一个界面发现存在很大适配问题 xff
  • Linux下常用的优秀软件

    Linux下优秀软件介绍 常用软件工具软件美化图像视频相关音频播放器下载工具科研利器终端Windows下常用软件运行 常用软件 下面的软件均是本人使用过的 xff0c 如果大家有自己觉得很好的软件 xff0c 欢迎留言 xff0c 好的软件
  • Charles抓包遇到的坑,看这一篇就够了

    Android 7 0 xff08 API 24 xff09 以下 xff0c 你可以直接使用 Charles 安装相关证书配置好代理后实现抓包功能 xff0c 本文主要讲android7 0以后如何实现抓包功能 xff1a 首先下载安装C
  • Bad notification posted from: Couldn't expand RemoteViews for: StatusBarNotification

    自定义通知栏有些机型报下面的错 xff1a android app RemoteServiceException Bad notification posted from package xxx Couldn 39 t expand Rem
  • SCP不用密码传输文件

    SCP不用密码传输文件 方法一 xff1a 使用sshpass yum install sshpass sshpass p password scp data scripts data log root 64 X X X X data da
  • 新版Unity里面怎么使用Post Process

  • 在Unity中使用.NET 4.x和在Unity项目添加外部程序集

    2019版本已经没有4 x等效运行选项了 xff1a 应该是只能选择4 x等效Api 然后API等级选择有两种选择 xff1a NET Standard 2 0 此配置文件与 NET Foundation发布的 NET Standard 2
  • Unity使用.NET4.x新的语法和语言功能

  • UE4设置 只修改蓝图节点的语言为英文

    原因 因为在查找需要的节点时 xff0c 输入英文更符合命名法 xff0c 为了更好的查找节点 xff0c 把节点的名字改成英文当然更好 xff01 操作步骤 取消下面的勾选即可 结果
  • Unity的InputSystem使用实践

    如何使用 首先得有一个PlayerInput在场景中 xff0c 每一个PlayerInput表示一个玩家 在Actions里面选择自己的Actions xff0c 可以新建 xff1a 比如在PlayerMaps中的MoveActions
  • 虚幻4C++编程入门(搬运1)

    首先我们将使用虚幻编辑器中的类向导生成基础 C 43 43 类 xff0c 以便蓝图稍后进行延展 下图展示了向导的第一步 新建一个 Actor 这里根据对character pawn和actor的描述 xff0c 知道了pawn是actor
  • 虚幻4C++编程入门深入了解

    这部分我们将讨论基础构建块以及它们之间相互关联的方式 在此我们将了解虚幻引擎如何使用 继承和合成构建自定义游戏性功能 游戏性类 xff1a 对象 Actor 和组件 多数游戏性类派生自 4 个主要类型 它们是 UObject AActor
  • 窗口焦点丢失问题分析

    从slog中的systemlog可以看出如下信息 xff1a 01 01 08 29 03 732 633 936 I WindowManager Relayout invis Window 42244420 u0 Keyguard mEx
  • ubuntu不能挂载U盘问题

    插上U盘一个弹窗显示不能挂载系统 就不附图了 自己也是在到处找了问题 xff0c 试了很多教程 xff0c 要么看不懂要么没用要么瞎写的 最后实测一个有用的 因为ubuntu默认不能识别U盘 解决方法 xff1a 安装exfat磁盘格式工具
  • unity3d个人版怎么改变主题=>黑色

    是有很多文章都有介绍如何使用操作 xff0c 我就不再多说 xff0c 主要是那个软件的问题 xff08 在下面我会附上winhex的下载地址和详细教程 xff09 一般会出问题的地方是试用版会出很多问题 xff0c 比如什么200k以上不
  • 【正则表达式】基础应用(匹配matches(regex))(转)

    正则表达式基础应用 匹配 字符 x 字符 x 反斜线字符 字符类 abc a b 或 c xff08 简单类 xff09 abc 任何字符 xff0c 除了 a b 或 c xff08 否定 xff09 a zA Z a 到 z 或 A 到
  • 一种动态更新flink任务配置的方法

    文章目录 1 原理2 例 xff0c 整数过滤2 1 并行度为12 2 并行度大于12 3 完整代码 参考链接 1 原理 参考Flink Spark 如何实现动态更新作业配置 xff0c 讲得比较详细 xff0c 这篇的文章的参考参考文献也
  • 一种Hudi on Flink动态同步元数据变化的方法

    文章目录 一 背景二 官方Schema Evolution例子三 Flink 43 Hudi实现Schema Evolution四 96 HoodieFlinkStreamer 96 流程浅析及扩展方法4 1 FlinkKafkaConsu
  • 一种处理Hive元数据与文件类型不同时SQL查询失败的方法

    文章目录 一 背景二 分析过程2 1 环境及测试数据2 1 1 环境2 1 2 测试数据 2 2 select语句异常分析2 2 1 异常分析2 2 2 捕获异常位置 2 3 insert overwrite语句异常分析2 3 1 异常分析
  • 一种处理Hive元数据与文件类型不同时SQL查询失败的方法(二)

    文章目录 一 异常触发SQL二 异常处理三 Hive on Spark依赖的Hive jar包部署 继上一篇之后 xff0c 又发现了一种新的报错位置 本篇对这种情况进行处理 xff0c 并验证这种处理方式是否适用于Hive on Spar