首页 文章 精选 留言 我的

精选列表

搜索[多语言适配],共10000篇文章
优秀的个人博客,低调大师

FydeOS v14.1 更新发布:着重优化 PC 设备适配性

本次更新为你带来: 优化的首次启动激活向导(OOBE)体验 ​ 编辑 切换为居中 FydeOS v14 系统首次启动向导步骤 优化的真文韵输入法 ​ 编辑 切换为居中 FydeOS v14 输入法 深色模式切换(实验性功能) ​ 编辑 切换为居中 FydeOS v14 深色模式 应用启动器(实验性功能) ​ 编辑 切换为居中 FydeOS v14 应用启动器 FydeOS v14.1 是我们对 FydeOS v14 的一个维护版本。在此次的发布里,值得一提的修改有: 修复了在某些设备上触控板无法使用的问题 修复了在某些设备上蓝牙和 wifi 无法使用的问题 修复了某些设备上无法挂载 SMB 网络存储磁盘的问题 修复了在某些设备上删除安卓程序之后图标仍然留存的问题 修复了若干跟真文韵输入法相关的问题 优化了安卓子系统激活启动的流程 优化了 Open GApps 配置程序以及配置 Open GApps 的流程 优化了 Installer 程序以及执行 Installer 时的流程 添加了若干对安卓子系统视频播放性能以及整体稳定性的优化 希望你喜欢本次更新的新功能!如果你有什么想对我们说的,欢迎随时到 FydeOS 社区或 Telegram 讨论组来告诉我们。 我们坚信,FydeOS 将逐渐成为一个更加开放的平台,你想要的所有程序,都能在 FydeOS 上使用。千里之行,这是我们的第一步,只愿今后的每一步都有你相伴。

优秀的个人博客,低调大师

Jeepay 1.5.0 发布:重构 MQ 适配,开箱即用的开源聚合支付系统

Jeepay是一套适合互联网企业使用的开源支付系统,支持多渠道服务商和普通商户模式。已对接微信支付,支付宝,云闪付官方接口,支持聚合码支付。 v1.5.0版本升级内容: 提取jeepay-components项目, 放置OSS, MQ公共组件包; 重构多MQ的实现,对生产者和消费者项目的使用透明,支持无缝切换三个厂商; ActiveMQ添加账密配置, 添加连接池pool配置; 修改聚合码前端项目的提示信息; 修改微信支付宝的参数配置项,支持自定义配置页面; 修复退款订单查询条件不生效等已知问题。 更多升级日志:https://www.jeequan.com/dev/update/category_1016.html 项目特点 支持多渠道对接,支付网关自动路由 已对接微信服务商和普通商户接口,支持V2和V3接口 已对接支付宝服务商和普通商户接口,支持RSA和RSA2签名 已对接云闪付服务商接口,可选择多家支付机构 提供http形式接口,提供各语言的sdk实现,方便对接 接口请求和响应数据采用签名机制,保证交易安全可靠 系统安全,支持分布式部署,高并发 管理端包括运营平台和商户系统 管理平台操作界面简洁、易用 支付平台到商户系统的订单通知使用MQ实现,保证了高可用,消息可达 支付渠道的接口参数配置界面自动化生成 使用spring security实现权限管理 前后端分离架构,方便二次开发 由原XxPay团队开发,有着多年支付系统开发经验 Jeepay运营平台功能 Jeepay商户系统功能 🍯 系统截图 以下截图是从实际已完成功能界面截取,截图时间为:2021-07-06 08:59

优秀的个人博客,低调大师

QuickDAO 4.1.7 版本发布,适配 Oracle 数据库以及新增 DCL 操作!

QuickDAO4.1.7版本已发布,可在maven中央仓库下载(阿里云仓库可能更新不及时),本次更新内容如下: [新增]Oracle数据库支持,支持11g及以上版本.由于Oracle分页功能较复杂,目前暂未实现Oracle数据库的分页API操作 [新增]DCL操作,用户可通过QuickDAO进行创建数据库用户,授权,取消授权等相关操作. [修复]解决postgre低版本获取自增id时报异常的问题 [优化]id生成器返回值改为String类型,可更灵活的生成id生成值 QuickDAO是一款简单易用的ORM框架,虽然市面上ORM框架已经非常多,但是有很多痛点这些框架并没有解决.QuickDAO相较于其他ORM框架的特点如下: 支持lambda表达式 从版本4.1.4开始,查询API支持lambda查询 lambda文档 支持外键关联操作 虽然很多ORM框架宣称支持外键查询,但无一例外最终形式仍然是让开发者手写SQL语句.QuickDAO在API设计层面上支持外键关联查询,真正的无需手写多表关联查询SQL语句. 外键关联查询文档 虚拟查询(无实体类查询) 常规的ORM框架都需要建立实体类,然后再根据实体类来查询。QuickDAO支持无实体类查询,不用事先建立实体类也能够事先对数据库的查询,修改和删除. 虚拟查询文档 事务操作 QuickDAO实现了事务功能,事务相关API提供了QuickDAO其他数据库操作一样便利的API,对于复杂的事务操作需求,QuickDAO也能够满足 事务操作文档 子查询支持 QuickDAO在API层面上支持子查询,您可以通过API直接拼接生成一个子查询SQL语句。这意味着即使是一些相当复杂的SQL语句,QuickDAO也能够轻松面对。 子查询文档 自定义数据库列类型,索引等 QuickDAO提供了实体注解,实体注解的类型丰富。通过实体注解,您可以定义数据库列的列名,列类型,列注释,表索引,非空,check约束等等等等。 实体注解文档 最后,写这个框架的初衷是市面上已有的ORM框架不能解决开发中痛点.QuickDAO经过近2年的支持开发,目前已经迭代到4.X版本,也在个人项目,公司项目实际使用过.希望本人开发的QuickDAO框架能够为中国的开源事业贡献一份自己的力量. QuickDAO文档:https://quickdao.schoolwow.cn QuickDAO的github地址:https://github.com/sunyue1380/QuickDAO4 QuickDAO的gitee地址:https://gitee.com/648823596/quickdao4

优秀的个人博客,低调大师

JetBrains 宣布 Jetpack Compose for Web,使用 Kotlin 开发适配多端的 Web UI

JetBrains 宣布了一款名为“Jetpack Compose for Web”的新工具,官方介绍称此项目基于 Google现代 UI 工具包 Jetpack Compose,支持使用 Kotlin 编写响应式 Web UI。 Jetpack Compose 是用于构建原生界面的新款 Android 工具包。它可简化并加快 Android 上的界面开发。使用更少的代码、强大的工具和直观的 Kotlin API,快速让应用生动而精彩。UI 代码和预览如下图所示: 据介绍,Jetpack Compose for Web 可简化并加速Web 应用的UI 开发,目标是在Web、桌面和 Android APP 之间实现UI 代码共享,一套代码适应多端。目前处于技术预览阶段。 fun greet() = listOf("Hello", "Hallo", "Hola", "Servus").random() renderComposable("greetingContainer") { var greeting by remember { mutableStateOf(greet()) } Button(attrs = { onClick { greeting = greet() } }) { Text(greeting) } } Result: Servus 使用 Compose for Web 构建用户界面 借助 Compose for Web,开发者通过使用 Kotlin 并应用Jetpack Compose 的概念和 API 为 Web 构建响应式用户界面,以表达应用程序的状态、行为和逻辑。 可组合的 DOM API 通过 DOM 元素和 HTML 标签表达设计和布局 使用类型安全的 HTML DSL 构建 UI 表示形式 通过使用类型安全的 CSS DSL 创建样式表来完全控制应用程序的外观 通过 DOM 子树与其他 JavaScript 库集成 fun main() { renderComposable("root") { var platform by remember { mutableStateOf("a platform") } P { Text("Welcome to Compose for $platform! ") Button(attrs = { onClick { platform = "Web" } }) { Text("...for what?") } } A("https://www.jetbrains.com/lp/compose-web") { Text("Learn more!") } } } 具有 Web 支持的多平台小部件 通过利用 Kotlin 的 Expect-actual 机制来提供特定于平台的实现,从而使用和构建可在 Android、桌面和 Web 上运行的 Compose 小部件 处于实验性阶段的一组布局原语 (layout primitives) 和API,这些原语和 API 与 Compose for Desktop/Android 的功能相似 示例代码 使用 Composable DOM 编写简单的计数器 fun main() { val count = mutableStateOf(0) renderComposable(rootElementId = "root") { Button(attrs = { onClick { count.value = count.value - 1 } }) { Text("-") } Span(style = { padding(15.px) }) { /* we use inline style here */ Text("${count.value}") } Button(attrs = { onClick { count.value = count.value + 1 } }) { Text("+") } } } 声明和使用样式表 object MyStyleSheet : StyleSheet() { val container by style { /* define a class `container` */ border(1.px, LineStyle.Solid, Color.RGB(255, 0, 0)) } } @Composable fun MyComponent() { Div(attrs = { classes(MyStyleSheet.container) /* use `container` class */ }) { Text("Hello world!") } } fun main() { renderComposable(rootElementId = "root") { Style(MyStyleSheet) /* mount the stylesheet */ MyComponent() } } 声明和使用 CSS 变量 object MyVariables : CSSVariables { val contentBackgroundColor by variable<Color>() /* declare a variable */ } object MyStyleSheet: StyleSheet() { val container by style { MyVariables.contentBackgroundColor(Color("blue")) /* set its value */ } val content by style { backgroundColor(MyVariables.contentBackgroundColor.value()) /* use it */ } } @Composable fun MyComponent() { Div(attrs = { classes(MyStyleSheet.container) }) { Span(attrs = { classes(MyStyleSheet.content) }) { Text("Hello world!") } } } 项目示例 下面提供了一些示例应用程序,分别使用 DOM 和 Widget API 进行了演示。 Jetpack Compose for Web 的登录页面本身就是一个 Compose 项目,使用 DOM API 和 CSS DSL 定义其内容、结构和布局,点此查看源码 Falling Balls游戏通过重用Compose for Desktop Demo 的实现来演示多平台小部件,点此查看源码

优秀的个人博客,低调大师

Android 系统自带图片裁剪功能(适配7.0、8.0、对了还有小米手机)

前段时间写了如何获取相册和拍照之后的照片并且进行显示和上传,这一次是如何进行圆形图像制作,经常看我写的笔记的人会知道,我很懒。那么我就懒的自定义了,目前需求就用原生的就好了,大神的轮子,我会在后面进行推荐。这篇笔记是依赖于:[Android调用相册、相机(兼容6.0、7.0、8.0)](https://www.jianshu.com/p/41b093d213fb) 文章撰写的,所以不会基本操作的,请先去看看那个。 先上效果哈: 一、布局设置 由于是圆形头像,所以,我们引用一个举世闻名的项目哈:CircleImageView <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <Button android:id="@+id/btn_get_pic_form_photo_album" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentStart="true" android:layout_margin="10dp" android:text="调用相册" /> <Button android:id="@+id/btn_get_Permission" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_margin="10dp" android:text="动态权限申请" /> <Button android:id="@+id/btn_get_pic_from_camera" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" android:layout_margin="10dp" android:text="调用相机" /> <de.hdodenhof.circleimageview.CircleImageView android:id="@+id/iv_test" android:layout_width="96dp" android:layout_height="96dp" android:layout_centerInParent="true" android:src="@drawable/ic_launcher_background" app:civ_border_color="#999999" app:civ_border_width="2dp" /> </RelativeLayout> 布局没有太大变化,就是把之前的ImageView修改为CircleImageView控件 二、.java 文件 这里增加了两个方法 方法一 private void photoClip(Uri uri) { // 调用系统中自带的图片剪裁 Intent intent = new Intent("com.android.camera.action.CROP"); intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); intent.setDataAndType(uri, "image/*"); // 下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪 intent.putExtra("crop", "true"); // aspectX aspectY 是宽高的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX outputY 是裁剪图片宽高 intent.putExtra("outputX", 150); intent.putExtra("outputY", 150); intent.putExtra("return-data", true); startActivityForResult(intent, 3); } 该方法,传入我们拿到的照片的 uri 进行激活 Android 系统的裁剪界面。我是在 onActivityResult 内进行调用该方法。 方法二 public String saveImage(String name, Bitmap bmp) { File appDir = new File(Environment.getExternalStorageDirectory().getPath()); if (!appDir.exists()) { appDir.mkdir(); } String fileName = name + ".jpg"; File file = new File(appDir, fileName); try { FileOutputStream fos = new FileOutputStream(file); bmp.compress(Bitmap.CompressFormat.PNG, 100, fos); fos.flush(); fos.close(); return file.getAbsolutePath(); } catch (IOException e) { e.printStackTrace(); } return null; } 该方法 传入获取照片的 bitmap 和裁剪之后的照片名称,生成文件的保存路径,韩小呆将其保存在了本地的根目录了。 完整代码 package com.example.hxd.pictest; import android.Manifest; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.os.SystemClock; import android.provider.MediaStore; import android.support.annotation.NonNull; import android.support.v4.content.FileProvider; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast; import com.bumptech.glide.Glide; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.List; import java.util.Objects; import java.util.logging.Logger; import de.hdodenhof.circleimageview.CircleImageView; import pub.devrel.easypermissions.EasyPermissions; public class MainActivity extends AppCompatActivity implements View.OnClickListener, EasyPermissions.PermissionCallbacks { private CircleImageView ivTest; private File cameraSavePath;//拍照照片路径 private Uri uri; private String[] permissions = {Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}; private String photoName = System.currentTimeMillis() + ".jpg"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btnGetPicFromCamera = findViewById(R.id.btn_get_pic_from_camera); Button btnGetPicFromPhotoAlbum = findViewById(R.id.btn_get_pic_form_photo_album); Button btnGetPermission = findViewById(R.id.btn_get_Permission); ivTest = findViewById(R.id.iv_test); btnGetPicFromCamera.setOnClickListener(this); btnGetPicFromPhotoAlbum.setOnClickListener(this); btnGetPermission.setOnClickListener(this); cameraSavePath = new File(Environment.getExternalStorageDirectory().getPath() + "/" + photoName); } @Override public void onClick(View v) { int id = v.getId(); switch (id) { case R.id.btn_get_pic_from_camera: goCamera(); break; case R.id.btn_get_pic_form_photo_album: goPhotoAlbum(); break; case R.id.btn_get_Permission: getPermission(); break; } } //获取权限 private void getPermission() { if (EasyPermissions.hasPermissions(this, permissions)) { //已经打开权限 Toast.makeText(this, "已经申请相关权限", Toast.LENGTH_SHORT).show(); } else { //没有打开相关权限、申请权限 EasyPermissions.requestPermissions(this, "需要获取您的相册、照相使用权限", 1, permissions); } } private void photoClip(Uri uri) { // 调用系统中自带的图片剪裁 Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); // 下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪 intent.putExtra("crop", "true"); // aspectX aspectY 是宽高的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX outputY 是裁剪图片宽高 intent.putExtra("outputX", 150); intent.putExtra("outputY", 150); intent.putExtra("return-data", true); startActivityForResult(intent, 3); } //激活相册操作 private void goPhotoAlbum() { Intent intent = new Intent(); intent.setAction(Intent.ACTION_PICK); intent.setType("image/*"); startActivityForResult(intent, 2); } //激活相机操作 private void goCamera() { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { uri = FileProvider.getUriForFile(MainActivity.this, "com.example.hxd.pictest.fileprovider", cameraSavePath); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); } else { uri = Uri.fromFile(cameraSavePath); } intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); MainActivity.this.startActivityForResult(intent, 1); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); //框架要求必须这么写 EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); } //成功打开权限 @Override public void onPermissionsGranted(int requestCode, @NonNull List<String> perms) { Toast.makeText(this, "相关权限获取成功", Toast.LENGTH_SHORT).show(); } //用户未同意权限 @Override public void onPermissionsDenied(int requestCode, @NonNull List<String> perms) { Toast.makeText(this, "请同意相关权限,否则功能无法使用", Toast.LENGTH_SHORT).show(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { String photoPath; if (requestCode == 1 && resultCode == RESULT_OK) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { photoPath = String.valueOf(cameraSavePath); photoClip(Uri.fromFile(cameraSavePath)); } else { photoPath = uri.getEncodedPath(); photoClip(uri); } Log.d("拍照返回图片路径:", photoPath); Glide.with(MainActivity.this).load(photoPath).into(ivTest); } else if (requestCode == 2 && resultCode == RESULT_OK) { photoPath = getPhotoFromPhotoAlbum.getRealPathFromUri(this, data.getData()); Log.d("相册返回图片路径:", photoPath); photoClip(data.getData()); Glide.with(MainActivity.this).load(photoPath).into(ivTest); } else if (requestCode == 3 && resultCode == RESULT_OK) { Bundle bundle = data.getExtras(); if (bundle != null) { //在这里获得了剪裁后的Bitmap对象,可以用于上传 Bitmap image = bundle.getParcelable("data"); //设置到ImageView上 ivTest.setImageBitmap(image); //也可以进行一些保存、压缩等操作后上传 String path = saveImage("头像", image); Log.d("裁剪路径:", path); } } super.onActivityResult(requestCode, resultCode, data); } public String saveImage(String name, Bitmap bmp) { File appDir = new File(Environment.getExternalStorageDirectory().getPath()); if (!appDir.exists()) { appDir.mkdir(); } String fileName = name + ".jpg"; File file = new File(appDir, fileName); try { FileOutputStream fos = new FileOutputStream(file); bmp.compress(Bitmap.CompressFormat.PNG, 100, fos); fos.flush(); fos.close(); return file.getAbsolutePath(); } catch (IOException e) { e.printStackTrace(); } return null; } } 当代码写成了这样,我以为就可以完事了,但是后来拿出来我的小米4和小米8se 测试的时候,我就懵逼了,出现了如下结果:描述一下:1、相册选择照片之后,只要进行裁剪就会出现“保存时发生错误,保存失败”;2、就是拍照之后进行裁剪无效果。 三、解决bug 1、将 photoClip() 方法内添加如下代码,其他代码不进行变动 uritempFile = Uri.parse("file://" + "/" + Environment.getExternalStorageDirectory().getPath() + "/" + System.currentTimeMillis() + ".jpg"); intent.putExtra(MediaStore.EXTRA_OUTPUT, uritempFile); intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); intent.putExtra("noFaceDetection", true); 这里的 uritempFile 是个 Uri 。 2、将裁剪的返回成功的返回方法内添加如下代码: Picasso.with(EditMyInfoActivity.this).load(uritempFile).into(ivHead); File file = null; try { file = new File(new URI(uritempFile.toString())); } catch (URISyntaxException e) { e.printStackTrace(); } //照片路径 String path = Objects.requireNonNull(file).getPath(); 然后,就可以完美的运行了。 三、推荐一篇自定义裁剪的博文 Android 高仿微信头像截取 打造不一样的自定义控件----作者: 家喻户晓的 张鸿洋 四、推荐几款裁剪框架 1、uCrop---薄荷,哔哩哔哩 在使用 2、android-crop---网易新闻,芒果TV 在使用 3、PhotoCrop---快手 使用 4、CropBitmap--->出自一位牛x的群友

优秀的个人博客,低调大师

适配不同分辨率的Android手机的简单处理方法

Android手机屏幕大小不一,有480x320, 640x360, 800x480.怎样才能让App自动适应不同的屏幕呢? 其实很简单,只需要在res目录下创建不同的layout文件夹,比如layout-640x360,layout-800x480,所有的layout文件在编译之后都会写入R.java里,而系统会根据屏幕的大小自己选择合适的layout进行使用。 本文转自94cool博客园博客,原文链接:http://www.cnblogs.com/94cool/archive/2013/05/29/3105360.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

不同Hadoop上的SQL数据库引擎如何适配BI工作

Hadoop上的SQL引擎Impala是一种新型查询系统基准,发现Spark和Hive在BI的工作负载中有自己的优势与弱势。 根据最新的基准,三个主要的SQL-on-Hadoop引擎,Apache Impala 2.3, Apache Spark 1.6 和Apache Hive 1.2,都有各自独特的优势和劣势,这令他们能很好的适应一些BI用例,而不是其他智能。 “一个引擎是无法满足所有需求的”,Dave Mariani,大规模AtScale的CEO和创始人,AtScale是一个专门在hadoop上实现BI的创新企业。“我们已经完成了布置,对于我们的客户而言这是多个引擎的补充。” 关于在Hadoop基础上的商业智能,AtScale帮助技术评估者选择最好的SQL –on-Hadoop技术,以帮助他们完成BI用例。AtScale测试团队使用星型架构基准(SSB)数据集,基于广泛使用的TPC-H数据(TPC- H是事务处理性能委员会公布的一套针对数据库决策支持能力的测试基准),将其进行修改使之更加 精确的表现一个面向BI的数据布局。数据集允许数据团队测试大型表的查询:在线订购表含有接近6百万行,大型客户表含有超过十亿行。 SQL-on-Hadoop引擎有不同的“甜区”工作负载 Mariani解释AtScale根据三个关键要求评价SQL-on-Hadoop引擎,以及它们的适应度是否能满足BI工作负载。 在大数据上执行。SQL-on-Hadoop引擎必须能够连续不断的分析十亿百亿行数据,并且没有生成错误,对命令的反应时间是10s或者是100s。 在小数据上速度快。引擎需要传递相互表现到已知查询模式,因此, SQL-on-Hadoop引擎在处理小数据时,不超过几秒钟就能将结果返回。(小数据是指有着成千上百万的命令行的数据)。 对用户来说是稳定的。企业级BI用户的基础是由成百上千的数据工作人员组成。SQL-on-Hadoop引擎必须在高度并行分析的工作负载中运行可靠。 Mariani领导团队为雅虎的BI创建了可能是世界上最大的在线分层分析!他相信这三个标准是基本要求的代表,是企业在Hadoop上实现BI时都会遇到的。这个标准,是测试团队和大量行业企业合作得出的,包括金融服务,医疗,零售,电信等。 “我们使用了真实世界的的经验去形成文档,每一个技术评估者可以将其作为是评估流程的一部分”。Josh Klahr补充,AtScale.生产部门副总裁。 测试团队发现三个引擎都通过了测试,足够稳定去支持BI工作负载,但是一个引擎不能满足所有需求。每个引擎都有自己的“甜区”,企业有可能去寻找所有引擎的混合用法,他们相信这有可能最适合他们的目标。 当Hive在逐渐思考SQL-on-Hadoop的默认值时,它将基准中引擎运行最慢的情况放置一边,令其不能很好的配合相互查询。 “如果你使用Hive Tez作为你的相互查询引擎,你能做到的最佳是2.4秒”。Mariani 说。 但是它可能缓慢,Hive也是三个引擎中最稳定的,在多个查询类型中有着最好的连贯性。 “Hive Tez就像乌龟。”. Mariani 说,“它总是能完成竞赛,但是不是在壮观,迅速的时尚下。但是它是最可靠的。” Impala和Spark,从利益方面来说,在处理小数据集时,他们是最好的。Impala会在大量的工作负载中覆盖了Spark,但是 Mariani提到Spark1.6相比Spark1.5有了巨大的性能改变,他希望Spark能继续保持这样的发展趋势,因为Spark已经划出一块大的开源社区,关注着它的发展。数据管理公司云纪元公司(Cloudera)最近计划捐赠Impala给Apache软件基金会,这可以为其发展增加势头。 现在,Impala是用例的王者,它需要大量的用户 “Impala在并发上真的很棒,” Mariani 说,“如果你打算拥有一大堆用户,让他们去使用小的快速的查询,Impala相比Spark是更好的选择。” “如果速度不是最重要的,但是稳定性和可靠性很重要,我会选择使用Hive Tez作为我的数据管线引擎”,他补充道,“对于那些需要大批处理的工作负载,我会选择Hive Tez。如果我想要我的BI用户接入我的数据仓库,我会使用Spark或者Impala。” Mariani 提到,虽然团队不能把其他引擎作为基准,如Apache Drill或者 Apache Presto,但是他们会在下次尝试。 他说,“你永远不知道引擎与引擎之间,谁将是可以作为赌注的更好的马。” 本文作者:Optimus Prime 来源:51CTO

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册