首页 文章 精选 留言 我的

精选列表

搜索[聚类],共10000篇文章
优秀的个人博客,低调大师

【Java入门提高篇】Day23 Java容器类详解(六)HashMap源码分析(中)

上一篇中对HashMap中的基本内容做了详细的介绍,解析了其中的get和put方法,想必大家对于HashMap也有了更好的认识,本篇将从了算法的角度,来分析HashMap中的那些函数。 HashCode 先来说说HashMap中HashCode的算法,在上一篇里,我们看到了HashMap中的put方法是这样的: public V put(K key, V value) { return putVal(hash(key), key, value, false, true); } 那这个hash函数又是什么呢?让我们来看看它的真面目: /** * 将高位与低位进行与运算来计算哈希值。因为在hashmap中使用2的整数幂来作为掩码,所以只在当前掩码之上的位上发生 * 变化的散列总是会发生冲突。(在已知的例子中,Float键的集合在小表中保持连续的整数)因此,我们应用一个位运算 * 来向下转移高位的影响。 这是在综合考虑了运算速度,效用和质量之后的权衡。因为许多常见的散列集合已经合理分布 * (所以不能从扩散中受益),并且因为我们使用树来处理bin中发生的大量碰撞的情况,所以我们尽可能以代价最低的方式 * 对一些位移进行异或运算以减少系统损失, 以及合并由于hashmap容量边界而不会被用于散列运算的最高位的影响。 * * todo 扰动函数 */ static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); } 可以看出,这里并不是简单的使用了key的hashCode,而是将它的高16位与低16位做了一个异或操作。(“>>>”是无符号右移的意思,即右移的时候左边空出的部分用0填充)这是一个扰动函数,具体效果后面会说明。接下来再看看之前的putval方法: 1 final V putVal(int hash, K key, V value, boolean onlyIfAbsent, 2 boolean evict) { 3 Node<K,V>[] tab; Node<K,V> p; int n, i; 4 //如果当前table未初始化,则先重新调整大小至初始容量 5 if ((tab = table) == null || (n = tab.length) == 0) 6 n = (tab = resize()).length; 7 //(n-1)& hash 这个地方即根据hash求序号,想了解更多散列相关内容可以查看下一篇 8 if ((p = tab[i = (n - 1) & hash]) == null) 9 //不存在,则新建节点 10 tab[i] = newNode(hash, key, value, null); 11 else { 12 Node<K,V> e; K k; 13 //先找到对应的node 14 if (p.hash == hash && 15 ((k = p.key) == key || (key != null && key.equals(k)))) 16 e = p; 17 else if (p instanceof TreeNode) 18 //如果是树节点,则调用相应的putVal方法,这部分放在第三篇内容里 19 //todo putTreeVal 20 e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value); 21 else { 22 //如果是链表则之间遍历查找 23 for (int binCount = 0; ; ++binCount) { 24 if ((e = p.next) == null) { 25 //如果没有找到则在该链表新建一个节点挂在最后 26 p.next = newNode(hash, key, value, null); 27 if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st 28 //如果链表长度达到树化的最大长度,则进行树化,该函数内容也放在第三篇 29 //todo treeifyBin 30 treeifyBin(tab, hash); 31 break; 32 } 33 if (e.hash == hash && 34 ((k = e.key) == key || (key != null && key.equals(k)))) 35 break; 36 p = e; 37 } 38 } 39 //如果已存在该key的映射,则将值进行替换 40 if (e != null) { // existing mapping for key 41 V oldValue = e.value; 42 if (!onlyIfAbsent || oldValue == null) 43 e.value = value; 44 afterNodeAccess(e); 45 return oldValue; 46 } 47 } 48 //修改次数加一 49 ++modCount; 50 if (++size > threshold) 51 resize(); 52 afterNodeInsertion(evict); 53 return null; 54 } 注意看第八行的代码: tab[i = (n - 1) & hash] (n - 1) & hash即通过key的hash值来取对应的数组下标,并非是对table的size进行取余操作。 那么,为什么要这样做呢?首先,扰动函数的目的就是为了扩大高位的影响,使得计算出来的数值包含了高 16 位和第 16 位的特性,让 hash 值更加深不可测来降低碰撞的概率。从hash方法的注释中,我们也可以找到答案,一般的散列,其实都是做取余处理,但是HashMap中的table大小是2的整数次幂,也就是说,肯定不是质数,那么在取余的时候,偶数的映射范围势必就要小了一半,这样效果显然就差很多,而且,除法和取余其实是很慢的操作,所以在JDK8中,使用了一种很巧妙的方式来进行散列。首先,table的大小size设置成了2的整数次幂,这样使用size-1就变成了掩码,下面是我找的一张图,能很好的解释这个过程: n是table的大小,默认是16,二进制即为10000,n - 1对应的二进制则为1111,这样再与hash值做“与”操作时,就变成了掩码,除了最后四位全部被置为0,而最后四位的范围肯定会落在(0~n-1)之间,正好是数组的大小范围,散列函数的妙处就在于此了。简直不能更稳,一波操作猛如虎。 那么我们继续上一篇的栗子,我们来一步一步分析一下,小明和小李的hash值的映射过程: 小明的hash值是756692,转换为二进制为10111000101111010100,table的大小是32,n-1=31,对应的二进制为:11111,做“与”运算之后,得到的结果是10100,即为20。 小李的hash值是757012,转换为二进制为10111000110100010100,与11111做与运算后,得到的结果也是10100,即20,于是就与小明发生了冲突,但还是要先来后到,于是小李就挂在了小明后面。 散列函数看完了,我们接下来再看看扩容函数。 扩容函数 扩容函数其实之前也已经见过了,就在上面的putVal方法里,往上面翻一翻,第六行可以看到resize函数,这就是扩容函数,让我们来看看它的庐山真面目: 1 /** 2 * 初始化或将table的大小进行扩容。 如果table为null,则按照字段threshold中的初始容量目标进行分配。 3 * 否则,因为我们使用2次幂进行扩容,所以在新表中,来自每个bin中的元素必须保持在相同的索引处,或者以原偏移量的2次幂进行移动。 4 */ 5 final Node<K,V>[] resize() { 6 Node<K,V>[] oldTab = table; 7 int oldCap = (oldTab == null) ? 0 : oldTab.length; 8 int oldThr = threshold; 9 int newCap, newThr = 0; 10 if (oldCap > 0) { 11 if (oldCap >= MAXIMUM_CAPACITY) { 12 threshold = Integer.MAX_VALUE; 13 return oldTab; 14 } 15 //新的容量扩展成原来的两倍 16 else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY && 17 oldCap >= DEFAULT_INITIAL_CAPACITY) 18 //阈值也调整为原来的两倍 19 newThr = oldThr << 1; // double threshold 20 } 21 else if (oldThr > 0) // initial capacity was placed in threshold 22 newCap = oldThr; 23 else { // zero initial threshold signifies using defaults 24 newCap = DEFAULT_INITIAL_CAPACITY; 25 newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY); 26 } 27 if (newThr == 0) { 28 float ft = (float)newCap * loadFactor; 29 newThr = (newCap < MAXIMUM_CAPACITY && ft < (float)MAXIMUM_CAPACITY ? 30 (int)ft : Integer.MAX_VALUE); 31 } 32 threshold = newThr; 33 @SuppressWarnings({"rawtypes","unchecked"}) 34 Node<K,V>[] newTab = (Node<K,V>[])new Node[newCap]; 35 table = newTab; 36 //将旧数组中的node重新散列到新数组中 37 if (oldTab != null) { 38 for (int j = 0; j < oldCap; ++j) { 39 Node<K,V> e; 40 if ((e = oldTab[j]) != null) { 41 oldTab[j] = null; 42 if (e.next == null) 43 newTab[e.hash & (newCap - 1)] = e; 44 else if (e instanceof TreeNode) 45 ((TreeNode<K,V>)e).split(this, newTab, j, oldCap); 46 else { // preserve order 47 Node<K,V> loHead = null, loTail = null; 48 Node<K,V> hiHead = null, hiTail = null; 49 Node<K,V> next; 50 do { 51 next = e.next; 52 if ((e.hash & oldCap) == 0) { 53 if (loTail == null) 54 loHead = e; 55 else 56 loTail.next = e; 57 loTail = e; 58 } 59 else { 60 if (hiTail == null) 61 hiHead = e; 62 else 63 hiTail.next = e; 64 hiTail = e; 65 } 66 } while ((e = next) != null); 67 if (loTail != null) { 68 loTail.next = null; 69 newTab[j] = loHead; 70 } 71 if (hiTail != null) { 72 hiTail.next = null; 73 newTab[j + oldCap] = hiHead; 74 } 75 } 76 } 77 } 78 } 79 return newTab; 80 } 这里可以看到,如果原来的table还未被初始化的话,调用该函数后就会被扩容到默认大小(16),上一篇中也已经说过,HashMap也是使用了懒加载的方式,在构造函数中并没有初始化table,而是在延迟到了第一次插入元素之后。 当使用put插入元素的时候,如果发现目前的bins占用程度已经超过了Load Factor所设置的比例,那么就会发生resize,简单来说就是把原来的容量和阈值都调整为原来的2倍,之后重新计算index,把节点再放到新的bin中。因为index值的计算与table数组的大小有关,所以扩容后,元素的位置有可能会调整: 以上图为例,如果对应的hash值第五位是0,那么做与操作后,得到的序号不会变,那么它的位置就不会改变,相反,如果是1,那么它的新序号就会变成原来的序号+16,。 好像也不是很多嘛,嗯,算法部分就先介绍到这里了,之后的一篇再来说说HashMap中的EntrySet,KeySet和values(如果时间够的话顺便把迭代器也说一说)。 好了,本篇就此愉快的结束了,最后祝大家端午节快乐!如果觉得内容还不错的话记得动动小手点关注哦,你的支持就是我最大的动力! 真正重要的东西,用眼睛是看不见的。

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

又一人类阵地沦陷,酒店礼宾也将被机器人取代

希尔顿与 IBM 沃森合作测试 AI 礼宾机器人。 据悉,北京时间 3 月 10 日凌晨,酒店运营商希尔顿与 IBM 沃森达成了一项合作,他们计划在希尔顿旗下的美国连锁酒店里测试一种人工智能礼宾机器人。 目前,这款被命名为“康妮”的人工智能机器人,被部署在弗吉尼亚州的 Hilton McLean 酒店内。酒店的住客可以向康妮提问一些问题,例如询问一些周边的餐厅、旅游名胜地和酒店信息等。但是到现在为止,康妮还不能帮助客人直接办理入住手续。 康妮的原型是机器人 Nao。Nao 是由法国的机器人公司 Aldebaran 设计开发的。Nao 可以运用多种语言同用户进行对话,目前,它在全球范围内已经承担了多种职务。比如,Nao 在日本的银行里就充当了助理的角色。而希尔顿的康妮,采用的是 IBM 沃森的软件,这种软件能给康妮提供自然语言处理方面的帮助,让康妮可以更好的理解人类的对话,从而做出应答。 其实,希尔顿在酒店试用人工智能礼宾机器人并不是什么新鲜事了。在日本,有一家名为 Henn-na Hotel 的酒店就已经全部使用机器人为住客提供服务了。这些机器人中既包括机器人 Nao,也包括一种和实物同等大小的迅猛龙机器人。Henn-na Hotel 正在用这些机器为住客提供英文的登记入住服务。 在全球,机器人被应用于各种各样的工作环境以取代或辅助人类活动。因此,希尔顿此次测试人工智能礼宾机器人并不令人感到意外。不过这家连锁酒店运营商并不急于让康妮承担更多的职责。他们预测,在未来的 30 到 40 年时间里,将会有近一半的工作岗位变得自动化。而在这些很有可能被自动化的工作岗位里,就包括酒店礼宾这样的酒店必须要有的岗位。 原文发布时间: 2016-03-10 15:00 本文作者: 伶轩 本文来自云栖社区合作伙伴镁客网,了解相关信息可以关注镁客网。

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

[android更新类的内容开发APP]四、项目布局的基本功能(继续)

昨天,只拿到电脑,别说,眼泪 http://joveth.github.io/funny/ 1.选项卡的滑动效果 要知道。用这个选项卡就是想让它滑动起来,不然的话。我才不喜欢用它呢。 在让他滑动之前,先来说一下上一张 的问题。话说。依照设计器下载下来的包,替换到 我们的 res之后,我发现,tabhost的选项颜色没有变,在我尝试 了各种方法之后,最终,我tm放弃了,好吧。正好 找到了这个滑动效果的demo,还有选项卡的颜色切换效果。 话不多说 ,改进我们的东西吧。 1.改动我们的 acitivity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TabHost android:id="@+id/tab_host" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TabWidget android:id="@android:id/tabs" android:layout_width="match_parent" android:layout_height="48dp" android:background="@drawable/tab_widget_bg" /> <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent" /> <!-- 隐藏 --> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="gone" > <fragment android:id="@+id/fragment_image" android:name="com.jov.germany.frame.ImageFrame" android:layout_width="match_parent" android:layout_height="match_parent" /> <fragment android:id="@+id/fragment_text" android:name="com.jov.germany.frame.TextFrame" android:layout_width="match_parent" android:layout_height="match_parent" /> <fragment android:id="@+id/fragment_both" android:name="com.jov.germany.frame.BothFrame" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout> </LinearLayout> </TabHost> </LinearLayout> 这里面加入了viewpage。还有把FramLayout隐藏了 当中的布局文件: res/color/tab_widget_text.xml <?xml version="1.0" encoding="utf-8"?> <!-- 标签页tab 文字切换颜色 --> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_selected="true" android:color="@color/color_orange"/> <item android:color="#000"/> </selector> value/color.xml中加入: <color name="color_orange">#FF9224</color> 为啥是橘黄,我……假设你不喜欢,百度HTML颜色代码表,找一个你 自己的最爱 在来改动我们的 MainAcitivity.java package com.jov.germany; import java.util.ArrayList; import java.util.List; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.TabHost; import android.widget.TabHost.OnTabChangeListener; import android.widget.TabHost.TabContentFactory; import android.widget.TabHost.TabSpec; import android.widget.TextView; public class MainActivity extends FragmentActivity { public static final String PAGE1_ID = "page1"; public static final String PAGE2_ID = "page2"; public static final String PAGE3_ID = "page3"; private TabHost tabHost; // TabHost private List<View> views; // ViewPager内的View对象集合 private FragmentManager manager; // Activity管理器 private ViewPager pager; // ViewPager @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化资源 pager = (ViewPager) findViewById(R.id.viewpager); tabHost = (TabHost) findViewById(R.id.tab_host); manager = getSupportFragmentManager(); views = new ArrayList<View>(); views.add(manager.findFragmentById(R.id.fragment_image).getView()); views.add(manager.findFragmentById(R.id.fragment_text).getView()); views.add(manager.findFragmentById(R.id.fragment_both).getView()); // 管理tabHost開始 tabHost.setup(); // 传一个空的内容给TabHost,不能用上面两个fragment TabContentFactory factory = new TabContentFactory() { @Override public View createTabContent(String tag) { return new View(MainActivity.this); } }; // tab1 TabSpec tabSpec = tabHost.newTabSpec(PAGE1_ID); tabSpec.setIndicator(createTabView(R.string.fragment_image_str)); tabSpec.setContent(factory); tabHost.addTab(tabSpec); // tab2 TabSpec tabSpec2 = tabHost.newTabSpec(PAGE2_ID); tabSpec2.setIndicator(createTabView(R.string.fragment_text_str)); tabSpec2.setContent(factory); tabHost.addTab(tabSpec2); // tab3 TabSpec tabSpec3 = tabHost.newTabSpec(PAGE3_ID); tabSpec3.setIndicator(createTabView(R.string.fragment_both_str)); tabSpec3.setContent(factory); tabHost.addTab(tabSpec3); tabHost.setCurrentTab(0); // 管理tabHost结束 // 设置监听器和适配器 pager.setAdapter(new PageAdapter()); pager.setOnPageChangeListener(new PageChangeListener()); tabHost.setOnTabChangedListener(new TabChangeListener()); } /** * PageView Adapter * * @author Administrator * */ private class PageAdapter extends PagerAdapter { @Override public int getCount() { return views.size(); } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1; } @Override public void destroyItem(ViewGroup view, int position, Object arg2) { view.removeView(views.get(position)); } @Override public Object instantiateItem(ViewGroup view, int position) { try { if (views.get(position).getParent() == null) { view.addView(views.get(position)); } else { ((ViewGroup) views.get(position).getParent()) .removeView(views.get(position)); view.addView(views.get(position)); } } catch (Exception e) { e.printStackTrace(); } return views.get(position); } } /** * 标签页点击切换监听器 * * @author Administrator * */ private class TabChangeListener implements OnTabChangeListener { @Override public void onTabChanged(String tabId) { if (PAGE1_ID.equals(tabId)) { pager.setCurrentItem(0); } else if (PAGE2_ID.equals(tabId)) { pager.setCurrentItem(1); } else if (PAGE3_ID.equals(tabId)) { pager.setCurrentItem(2); } } } /** * ViewPager滑动切换监听器 * * @author Administrator * */ private class PageChangeListener implements OnPageChangeListener { @Override public void onPageScrollStateChanged(int arg0) { } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageSelected(int arg0) { tabHost.setCurrentTab(arg0); } } /** * 创建tab View * * @param string * @return */ private View createTabView(int stringId) { View tabView = getLayoutInflater().inflate(R.layout.tab, null); TextView textView = (TextView) tabView.findViewById(R.id.tab_text); textView.setText(stringId); return tabView; } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } 当中的 layout/tab.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="@drawable/state_tabs_bg" > <TextView android:id="@+id/tab_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="11dp" android:layout_gravity="center_horizontal" android:textSize="18sp" android:textColor="@color/tab_widget_text"/> </LinearLayout> drawable/state_tabs_bg.xml <?xml version="1.0" encoding="utf-8"? > <!-- tab每一个标签背景 --> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_selected="true" android:drawable="@drawable/tabs_selected_bg" /> <item android:drawable="@drawable/tabs_normal_bg"></item> </selector> drawable/tabs_selected_bg.xml <?xml version="1.0" encoding="UTF-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item> <shape> <solid android:color="@color/color_orange" /> </shape> </item> <item android:bottom="5dp"> <shape> <solid android:color="#eeeeee" /> </shape> </item> </layer-list> drawable/tabs_normal_bg.xml <?xml version="1.0" encoding="UTF-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item> <shape> <solid android:color="@color/color_orange" /> </shape> </item> <item android:bottom="1dp"> <shape> <solid android:color="#eeeeee" /> </shape> </item> </layer-list> 好至此的话 我们的代码算是ok了,可是当你执行的时候却发现跑不起来。为啥 呢??? 且看一下我们的Frame里面,改动 ImageFrame.java: package com.jov.germany.frame; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.jov.germany.R; public class ImageFrame extends Fragment{ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.image_frame, container, false); } } 你可能会认为没什么差别,看一下我们的Fragment引用的包,不一样哦。 好吧,最后 MainAcitivity.java中的String内容自己 在string.xml里面自己加把 没有截滑动效果。 近期各种忙,更新的 有点慢,没办法啊 源代码这里 版权声明:本文博客原创文章,博客,未经同意,不得转载。 本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4651652.html,如需转载请自行联系原作者

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

NoSQL四种——kv存储(memcache,Riak),列存储(Cassandra,Hbase),文档类(mongoDB,CouchDB)...

见:https://software.intel.com/sites/default/files/Configuration_and_Deployment_Guide_for_Cassandra_on_IA.pdf NoSQL databases can be classified into four categories:Key-Value StoreThis is the most basic data model, where the data is storedas key-value pairs. Columnar Store:Similar to key-value store, data is stored as key-value pairs.However, each entry (referenced by a key) contains one or more key-valuepairs instead of a value. A columnar store is essentially a two dimensionalarray (Tezer, 2014a).Document-Oriented DatabaseThe fundamental concept is thedocument,which is a group of data with internal structure that can be defined arbitrarily. A document is referenced by a key and this allows documents to nestinside one another. Unlike in relational databases, the internal structure ofa document does not need to be predefined and can be changed anytime.While this makes storing data with complex or even ever-changing structure much easier, it also poses a challenge for querying as the complexitygrows. Graph Database:This uses graph structures to store data and thus, is mostsuitable for heavily linked data that can be best represented in graphs。 见:http://edoc.sub.uni-hamburg.de/haw/volltexte/2016/3578/pdf/Thesis.pdf 里面介绍了如何去实现一个高性能的kv数据库,嵌入式的,参考了levelDB和LMDB等。 本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/bonelee/p/6322489.html ,如需转载请自行联系原作者

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

Sqoop找不到主类 Error: Could not find or load main class org.apache.sqoop.S...

最近由于要使用Sqoop来到出数据到hdfs,可是发现Sqoop1.4.5跟hadoop2.X不兼容,需要对Sqoop1.4.5进行编译,编译的具体方法见:http://my.codeweblog.com/AlbertHa/blog/318551 如果一切都顺利的话需要就不会遇到什么问题,但是有一个问题一直困扰了一周! 这是问题是什么呢? 就是每次执行$SQOOP_HOME/bin/sqoop脚本的时候总是抱一个错误: Error: Could not find or load main class org.apache.sqoop.Sqoop 这是因为找不到sqoop-1.4.5.jar文件导致的。 从网上搜了很多解决办法,具体的做法是:将sqoop-1.4.5.jar文件拷贝到$HADOOP_HOME/lib目录下一份,可是我照做的,但问题还是依旧,一周了,我实在是到了要放弃的地步了,开始怀疑自己的能力了都! 今天我在绝望之时,打开sqoop脚本看了一下,发现脚本的最后有这样一句: exec ${HADOOP_COMMON_HOME}/bin/hadoop org.apache.sqoop.Sqoop "$@" 这个应该就是执行hadoop jar命令的地方,看到这里或许你应该明白这个错误该怎么解决了吧? 解决办法: 修改$SQOOP_HOME/bin/sqoop脚本: * 修改前: exec ${HADOOP_COMMON_HOME}/bin/hadoop org.apache.sqoop.Sqoop "$@" * 修改后: exec ${HADOOP_COMMON_HOME}/bin/hadoopjar $SQOOP_HOME/sqoop-1.4.5.jarorg.apache.sqoop.Sqoop "$@" 即:显示指定sqoop-1.4.5.jar文件的所在位置。 然后执行sqoop help命令,就不会再报Could not find or load main class org.apache.sqoop.Sqoop 的错误了。 版本说明: Hadoop版本:Hadoop2.4.0 Sqoop版本:sqoop-1.4.5.bin__hadoop-2.0.4 不过视频上说直接可用,是不是因为我没在hxsyl下source /etc/profile,因为echo $SQOOP_HOME,还是以前的缓存,source就好了

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

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

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

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

用户登录
用户注册